Python 查看Flask中带有GAE的JSON呈现装饰器

Python 查看Flask中带有GAE的JSON呈现装饰器,python,json,google-app-engine,flask,Python,Json,Google App Engine,Flask,我正试图在Flask中为JSON编写一个视图呈现装饰器,代码如下: 问题是,我需要序列化为JSON、GAE模型,而jsonify函数对此不起作用。为此,我使用以下代码: 与上面代码段中的render_html示例类似,我编写了以下代码: def render_json(result): def wrapped(*args, **kwargs): json_string = json.dumps(result, cls=GaeEncoder) return app.respon

我正试图在Flask中为JSON编写一个视图呈现装饰器,代码如下:

问题是,我需要序列化为JSON、GAE模型,而jsonify函数对此不起作用。为此,我使用以下代码:

与上面代码段中的render_html示例类似,我编写了以下代码:

def render_json(result):
  def wrapped(*args, **kwargs):
    json_string = json.dumps(result, cls=GaeEncoder)
    return app.response_class(response=json_string, mimetype='application/json')
  return wrapped
问题是,我调用了一个用我的新decorator修饰的函数,得到以下错误:

AttributeError: 'Response' object has no attribute 'next'
TypeError: wrapped() takes exactly 1 argument (2 given)
有人能指出这是怎么回事吗? 谢谢

马科斯

编辑:这是回溯

Traceback (most recent call last):
File "/Applications/GoogleAppEngineLauncher.app/Contents/Resources/GoogleAppEngine-default.bundle/Contents/Resources/google_appengine/google/appengine/runtime/wsgi.py", line 208, in Handle
for chunk in result:
File "/Users/mchicote/Documents/projects/schoolnetwork/code/SchoolNetwork/sn/../lib/flaskext/gae_mini_profiler/profiler.py", line 286, in __call__
yield self.prof.runcall(result.next)
File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/cProfile.py", line 149, in runcall
return func(*args, **kw)
File "/Applications/GoogleAppEngineLauncher.app/Contents/Resources/GoogleAppEngine-default.bundle/Contents/Resources/google_appengine/google/appengine/ext/appstats/recording.py", line 1284, in appstats_wsgi_wrapper
result = app(environ, appstats_start_response)
File "/Users/mchicote/Documents/projects/schoolnetwork/code/SchoolNetwork/sn/../lib/flaskext/gae_mini_profiler/profiler.py", line 269, in wrapped_appstats_app
return old_app(environ, start_response)
File "/Users/mchicote/Documents/projects/schoolnetwork/code/SchoolNetwork/sn/../lib/flask/app.py", line 1689, in wsgi_app
response = self.make_response(self.handle_exception(e))
File "/Users/mchicote/Documents/projects/schoolnetwork/code/SchoolNetwork/sn/../lib/flask/app.py", line 1687, in wsgi_app
response = self.full_dispatch_request()
File "/Users/mchicote/Documents/projects/schoolnetwork/code/SchoolNetwork/sn/../lib/flask/app.py", line 1361, in full_dispatch_request
response = self.make_response(rv)
File "/Users/mchicote/Documents/projects/schoolnetwork/code/SchoolNetwork/sn/../lib/flask/app.py", line 1450, in make_response
rv = self.response_class.force_type(rv, request.environ)
File "/Users/mchicote/Documents/projects/schoolnetwork/code/SchoolNetwork/sn/../lib/werkzeug/wrappers.py", line 711, in force_type
response = BaseResponse(*_run_wsgi_app(response, environ))
File "/Users/mchicote/Documents/projects/schoolnetwork/code/SchoolNetwork/sn/../lib/werkzeug/wrappers.py", line 55, in _run_wsgi_app
return _run_wsgi_app(*args)
File "/Users/mchicote/Documents/projects/schoolnetwork/code/SchoolNetwork/sn/../lib/werkzeug/test.py", line 836, in run_wsgi_app
buffer.append(app_iter.next())
明白了! 以防万一有人觉得有用

第一个问题是我没有完全遵循上面代码片段中描述的模式。当我尝试遵循该模式时,我得到以下错误:

AttributeError: 'Response' object has no attribute 'next'
TypeError: wrapped() takes exactly 1 argument (2 given)
我尝试改变模式,认为render_json不接受任何参数(与接受模板的render_html相反),并编写了上面描述的render_json函数(以及原始帖子中描述的问题)。 在尝试了一些事情之后,我突然意识到我可能没有正确处理参数数量错误,所以我继续使用原始模式编写render_json。我得到了以下函数:

def render_json(**defaults):
    def wrapped(result):
        variables = defaults.copy()
        variables.update(result)
        json_string = json.dumps(result, cls=GaeEncoder)
        return app.response_class(response=json_string, mimetype='application/json')                       
    return wrapped
回到参数数错误,我尝试用另一种方法解决它。不知怎的,我突然想到问题可能出在render_json函数的使用上。render_html的装饰器用法如下所示:

@view(school_blueprint, '/', render_html('school/index.html'))
@view(school_blueprint, '/api/list', render_json)
@view(school_blueprint, '/api/list', render_json())
render_json的用法如下所示:

@view(school_blueprint, '/', render_html('school/index.html'))
@view(school_blueprint, '/api/list', render_json)
@view(school_blueprint, '/api/list', render_json())
作为Python的新手,我突然意识到我实际上并没有调用render_json函数,只是对它进行了命名。添加()解决了这个问题。新用法如下所示:

@view(school_blueprint, '/', render_html('school/index.html'))
@view(school_blueprint, '/api/list', render_json)
@view(school_blueprint, '/api/list', render_json())
无论如何,由于我是Python新手,我不知道技术上的解释,但在我看来,这似乎是名称vs invoke问题

谢谢你的帮助


Marcos

你能发布完整的回溯(包括文件名和行号)吗?没问题,我会添加到原始帖子中。谢谢