Skip to content

Commit 52df641

Browse files
authored
Merge pull request #87 from legenove/tlp_for_tornado
Tlp for tornado (fix bug)
2 parents cd39df0 + fc8c206 commit 52df641

File tree

5 files changed

+86
-95
lines changed

5 files changed

+86
-95
lines changed

swagger_py_codegen/templates/tornado/api.tpl

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,10 +3,10 @@ from __future__ import absolute_import
33

44
from core import RequestHandler
55
from .. import UserInfo
6-
from ..validators import validate_filter
6+
from ..validators import request_validate, response_filter
77

88
class ApiHandler(RequestHandler):
9-
on_initialize_decorators = [validate_filter]
9+
on_initialize_decorators = [response_filter, request_validate]
1010

1111
def get_current_user(self):
1212
authorization = self.request.headers.get('Authorization', '')

swagger_py_codegen/templates/tornado/blueprint.tpl

Lines changed: 1 addition & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -27,12 +27,4 @@ class UserInfo(object):
2727
if self.valid and self.user_id:
2828
# TODO: test
2929
self._account = None
30-
return self._account
31-
32-
33-
def before_request(obj):
34-
pass
35-
36-
37-
def after_request(obj):
38-
pass
30+
return self._account

swagger_py_codegen/templates/tornado/core.tpl

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@ class RequestHandler(tornado.web.RequestHandler):
4545
assert meth is not None, 'Unimplemented method %r' % request.method
4646

4747
for decorator in self.on_initialize_decorators:
48-
meth = decorator(meth)
48+
meth = decorator(self)(meth)
4949

5050
setattr(self, self.request.method.lower(), meth)
5151

swagger_py_codegen/templates/tornado/validators.tpl

Lines changed: 80 additions & 81 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,6 @@ import six
1111
from functools import wraps
1212
from jsonschema import Draft4Validator
1313

14-
from . import before_request, after_request
1514
from .schemas import validators, scopes, normalize, filters
1615

1716

@@ -70,86 +69,86 @@ class ValidatorAdaptor(object):
7069
return normalize(self.validator.schema, value)[0], errors
7170

7271
def request_validate(obj):
73-
request = obj.request
74-
endpoint = obj.endpoint
75-
user_info = obj.current_user
76-
if (endpoint, request.method) in scopes and not set(
77-
scopes[(endpoint, request.method)]
78-
).issubset(set(user_info.scopes)):
79-
raise tornado.web.HTTPError(403)
80-
81-
method = request.method
82-
if method == 'HEAD':
83-
method = 'GET'
84-
locations = validators.get((endpoint, method), {})
85-
for location, schema in six.iteritems(locations):
86-
if location == 'json':
87-
value = getattr(request, 'body', MultiDict())
88-
elif location == 'args':
89-
value = getattr(request, 'query_arguments', MultiDict())
90-
for k,v in value.iteritems():
91-
if isinstance(v, list) and len(v) == 1:
92-
value[k] = v[0]
93-
value = MultiDict(value)
94-
else:
95-
value = getattr(request, location, MultiDict())
96-
validator = ValidatorAdaptor(schema)
97-
result, reasons = validator.validate(value)
98-
if reasons:
99-
raise tornado.web.HTTPError(422, message='Unprocessable Entity',
100-
reason=json.dumps(reasons))
101-
setattr(obj, location, result)
102-
103-
104-
def response_filter(obj, resp):
105-
request = obj.request
106-
endpoint = obj.endpoint
107-
method = request.method
108-
if method == 'HEAD':
109-
method = 'GET'
110-
headers = None
111-
status = None
112-
if isinstance(resp, tuple):
113-
resp, status, headers = unpack(resp)
114-
filter = filters.get((endpoint, method), None)
115-
if filter:
116-
if len(filter) == 1:
117-
if six.PY3:
118-
status = list(filter.keys())[0]
119-
else:
120-
status = filter.keys()[0]
121-
122-
schemas = filter.get(status)
123-
if not schemas:
124-
# return resp, status, headers
125-
raise tornado.web.HTTPError(
126-
500, message='`%d` is not a defined status code.' % status)
127-
128-
resp, errors = normalize(schemas['schema'], resp)
129-
if schemas['headers']:
130-
headers, header_errors = normalize(
131-
{'properties': schemas['headers']}, headers)
132-
errors.extend(header_errors)
133-
if errors:
134-
raise tornado.web.HTTPError(
135-
500, message='Expectation Failed',
136-
reason=json.dumps(errors))
137-
obj.set_status(status)
138-
obj.set_headers(headers)
139-
obj.write(json.dumps(resp))
140-
141-
142-
def validate_filter(view):
143-
144-
@wraps(view)
145-
def wrapper(*args, **kwargs):
146-
self = view.im_self
147-
request_validate(self)
148-
before_request(self)
149-
resp = view(*args, **kwargs)
150-
after_request(self)
151-
response_filter(self, resp)
152-
return wrapper
72+
def _request_validate(view):
73+
@wraps(view)
74+
def wrapper(*args, **kwargs):
75+
request = obj.request
76+
endpoint = obj.endpoint
77+
user_info = obj.current_user
78+
if (endpoint, request.method) in scopes and not set(
79+
scopes[(endpoint, request.method)]
80+
).issubset(set(user_info.scopes)):
81+
raise tornado.web.HTTPError(403)
82+
83+
method = request.method
84+
if method == 'HEAD':
85+
method = 'GET'
86+
locations = validators.get((endpoint, method), {})
87+
for location, schema in six.iteritems(locations):
88+
if location == 'json':
89+
value = getattr(request, 'body', MultiDict())
90+
elif location == 'args':
91+
value = getattr(request, 'query_arguments', MultiDict())
92+
for k,v in six.iteritems(value):
93+
if isinstance(v, list) and len(v) == 1:
94+
value[k] = v[0]
95+
value = MultiDict(value)
96+
else:
97+
value = getattr(request, location, MultiDict())
98+
validator = ValidatorAdaptor(schema)
99+
result, reasons = validator.validate(value)
100+
if reasons:
101+
raise tornado.web.HTTPError(422, message='Unprocessable Entity',
102+
reason=json.dumps(reasons))
103+
setattr(obj, location, result)
104+
return view(*args, **kwargs)
105+
return wrapper
106+
return _request_validate
107+
108+
109+
def response_filter(obj):
110+
def _response_filter(view):
111+
@wraps(view)
112+
def wrapper(*args, **kwargs):
113+
resp = view(*args, **kwargs)
114+
request = obj.request
115+
endpoint = obj.endpoint
116+
method = request.method
117+
if method == 'HEAD':
118+
method = 'GET'
119+
headers = None
120+
status = None
121+
if isinstance(resp, tuple):
122+
resp, status, headers = unpack(resp)
123+
filter = filters.get((endpoint, method), None)
124+
if filter:
125+
if len(filter) == 1:
126+
if six.PY3:
127+
status = list(filter.keys())[0]
128+
else:
129+
status = filter.keys()[0]
130+
131+
schemas = filter.get(status)
132+
if not schemas:
133+
# return resp, status, headers
134+
raise tornado.web.HTTPError(
135+
500, message='`%d` is not a defined status code.' % status)
136+
137+
resp, errors = normalize(schemas['schema'], resp)
138+
if schemas['headers']:
139+
headers, header_errors = normalize(
140+
{'properties': schemas['headers']}, headers)
141+
errors.extend(header_errors)
142+
if errors:
143+
raise tornado.web.HTTPError(
144+
500, message='Expectation Failed',
145+
reason=json.dumps(errors))
146+
obj.set_status(status)
147+
obj.set_headers(headers)
148+
obj.write(json.dumps(resp))
149+
return
150+
return wrapper
151+
return _response_filter
153152

154153

155154
def unpack(value):

swagger_py_codegen/tornado.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -227,13 +227,13 @@ def _process(self):
227227
swagger.pop('schemes', None)
228228
yield Specification(dict(swagger=json.dumps(swagger, indent=2)))
229229

230-
yield Validator(dict(scopes_supported=self.swagger.scopes_supported))
230+
yield Validator()
231231

232232
yield Api()
233233

234234
yield Core()
235235

236-
yield Blueprint()
236+
yield Blueprint(dict(scopes_supported=self.swagger.scopes_supported))
237237

238238
yield App(dict(blueprint=self.swagger.module_name,
239239
base_path=self.swagger.base_path))

0 commit comments

Comments
 (0)