1

このスニペットに従って、Flask で JSON 用のビュー レンダリング デコレータを作成しようとしています: http://flask.pocoo.org/snippets/18/

問題は、 jsonify関数が機能しないJSON、GAEモデルとしてシリアル化する必要があることです。このために、次のコードを使用しています: 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())
4

1 に答える 1

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 関数を実際に呼び出すのではなく、名前を付けるだけであることに気づきました。() を追加すると問題が解決しました。新しい使い方は次のようになります。

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

とにかく、私はPythonが初めてなので、技術的な説明はわかりませんが、名前と呼び出しの問題のようです..

助けてくれてありがとう。

マルコス

于 2012-09-26T08:06:08.670 に答える