2012-09-25 14 views
1
渲染裝飾的JSON與GAE

我試圖寫一個JSON視圖渲染裝飾在瓶下面的這個片段:http://flask.pocoo.org/snippets/18/查看在瓶

的事情是,我需要序列化JSON作爲,GAE模型,用於其中jsonify功能不起作用。對於這個我用下面的代碼:http://blog.worldmaker.net/2009/dec/08/simple-app-engine-json-serialization-snippet/

類似上面代碼片斷中的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 

的問題是,我調用飾有我的新功能裝飾,我得到以下錯誤:

AttributeError: 'Response' object has no attribute 'next' 

任何人都可以指出這是怎麼回事? 謝謝!

馬科斯

編輯:這裏是回溯

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()) 
+0

你能發佈完整的回溯(包括文件名和行號)嗎? –

+0

沒問題,我會添加到原來的帖子。謝謝! –

回答

0

明白了! 以防萬一有人發現它有幫助...

第一個問題是,我沒有遵循上面代碼段中描述的完全相同的模式。當我試圖遵循的模式,我發現了以下錯誤:

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')) 

和render_json的用法是這樣的:

@view(school_blueprint, '/api/list', render_json) 

在Python中作爲新的,它發生,我認爲我實際上並沒有調用render_json函數,但只能命名它。 Adding()解決了這個問題。新用法如下:

@view(school_blueprint, '/api/list', render_json()) 

無論如何,我是新的Python我不知道的技術解釋,但在我看來,是名VS調用問題..

謝謝爲你提供幫助。

Marcos