web-dev-qa-db-ja.com

Flaskの変数とurl_forでエラーを構築します

インターネット上で同様の問題を抱えている1人か2人の人を見つけたが、どこにも投稿された解決策を見たことがない。以下のコード/テンプレートからビルドエラーが発生しますが、問題がどこにあるのか、なぜ発生しているのかわかりません。テンプレートが関数を認識していないようですが、これが発生する理由がわかりません。どんな助けでも大歓迎です-私は今、2晩キーボードに打ちつけてきました。

関数:

@app.route('/viewproj/<proj>', methods=['GET','POST'])
def viewproj(proj):

...

テンプレートの抜粋:

{% for project in projects %}
  <li>
<a href="{{ url_for('viewproj', proj=project.project_name) }}">
{{project.project_name}}</a></li>
{% else %}
No projects
{% endfor %}

エラーログ: https://Gist.github.com/168425

編集:また、URLの作成時に変数「proj」を認識しないことを含めたいので、パラメーターとして値を追加するだけです。次に例を示します。// myproject/viewproj?projname = what + up

最後の数行:

[Wed Jan 25 09:47:34 2012] [error] [client 199.58.143.128]   File "/srv/www/myproject.com/myproject/templates/layout.html", line 103, in top-level template code, referer: xx://myproject.com/
[Wed Jan 25 09:47:34 2012] [error] [client 199.58.143.128]     {% block body %}{% endblock %}, referer: xx://myproject.com/
[Wed Jan 25 09:47:34 2012] [error] [client 199.58.143.128]   File "/srv/www/myproject.com/myproject/templates/main.html", line 34, in block "body", referer: xx://myproject.com/
[Wed Jan 25 09:47:34 2012] [error] [client 199.58.143.128]     <a href="{{ url_for('viewproj', proj=project.project_name) }}">, referer: xx://myproject.com/
[Wed Jan 25 09:47:34 2012] [error] [client 199.58.143.128]   File "/usr/lib/python2.7/dist-packages/flask/helpers.py", line 195, in url_for, referer: xx://myproject.com/
[Wed Jan 25 09:47:34 2012] [error] [client 199.58.143.128]     return ctx.url_adapter.build(endpoint, values, force_external=external), referer: xx://myproject.com/
[Wed Jan 25 09:47:34 2012] [error] [client 199.58.143.128]   File "/usr/lib/pymodules/python2.7/werkzeug/routing.py", line 1409, in build, referer: xx://myproject.com/
[Wed Jan 25 09:47:34 2012] [error] [client 199.58.143.128]     raise BuildError(endpoint, values, method), referer: xx://myproject.com/
[Wed Jan 25 09:47:34 2012] [error] [client 199.58.143.128] BuildError: ('viewproj', {'proj': '12th'}, None), referer: xx://myproject.com/
18
Rob

url_forは関数を検索し、呼び出したい関数の名前を渡します。だからあなたは使うべきです:

{{ url_for('viewproj', proj=xxx) }}

同じ問題が発生しました。そして私はそれに応じてそれを解決しました: Flask error:werkzeug.routing.BuildError

24
atupal

同じ問題を解決しただけで、解決策は本当に面白いです。

「。」を追加するだけですurl_forのメソッド名の前。

このような:

<a href="{{ url_for('.viewproj', proj=project.project_name) }}">

そして、それは今はうまくいくはずです。

Flaskからのこのソリューションのドキュメントは http://flask.pocoo.org/docs/0.10/api/ であり、引用します:

flask.url_for(endpoint、** values)指定されたメソッドを使用して、指定されたエンドポイントへのURLを生成します。

ターゲットエンドポイントにとって不明な可変引数は、生成されたURLにクエリ引数として追加されます。クエリ引数の値がNoneの場合、ペア全体がスキップされます。ブループリントがアクティブな場合、ローカルエンドポイントの前にドット(。)を付けることで、同じブループリントへの参照をショートカットできます。

これは、現在のブループリントにローカルなインデックス関数を参照します。

url_for('.index')
19
Arthur Wang

すでに回答済みですが、私はまだこれに返信します。理由は明確にするためです。それらを読んだ後でも、url_for()のソースファイルを調べないと、何が起こっているのか理解できませんでした。

きれいな例:

<a href="{{ url_for('viewproj', proj='<projname>') }}">Project name</a>

@app.route('/viewproj/<projname>', methods=['GET','POST'])
def viewproj(proj):
1
Victor RENÉ

viewprojという名前のルーティング関数が複数ある可能性があります。

その上、投稿した出力は、投稿したテンプレートコードと一致しません。 _myproject/viewproj?projname=what+up_は、_projname=..._がurl_for()に渡されたことを意味しますが、ビュー関数は_proj=..._を想定しています

0
ThiefMaster

「project.project_name」がテンプレートで正しく解決されているかどうかを確認します。 「プロジェクト」をテンプレートに正しく渡していますか?代わりに 'proj'の値をハードコードして、URLが生成されていることを確認してください。何かのようなもの:-

<a href="{{ url_for('viewproj', proj='new_project') }}">new project</a>
0
sojin