Skip to content

Commit 1d2281f

Browse files
committed
fix bug python3 decorator has not im_self
1 parent 813e146 commit 1d2281f

File tree

4 files changed

+84
-84
lines changed

4 files changed

+84
-84
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/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 & 80 deletions
Original file line numberDiff line numberDiff line change
@@ -70,86 +70,86 @@ class ValidatorAdaptor(object):
7070
return normalize(self.validator.schema, value)[0], errors
7171

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

154154

155155
def unpack(value):

swagger_py_codegen/tornado.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -227,7 +227,7 @@ 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

0 commit comments

Comments
 (0)