インターネット上で同様の問題を抱えている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/
url_forは関数を検索し、呼び出したい関数の名前を渡します。だからあなたは使うべきです:
{{ url_for('viewproj', proj=xxx) }}
同じ問題が発生しました。そして私はそれに応じてそれを解決しました: Flask error:werkzeug.routing.BuildError
同じ問題を解決しただけで、解決策は本当に面白いです。
「。」を追加するだけです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')
すでに回答済みですが、私はまだこれに返信します。理由は明確にするためです。それらを読んだ後でも、url_for()のソースファイルを調べないと、何が起こっているのか理解できませんでした。
きれいな例:
<a href="{{ url_for('viewproj', proj='<projname>') }}">Project name</a>
@app.route('/viewproj/<projname>', methods=['GET','POST'])
def viewproj(proj):
viewproj
という名前のルーティング関数が複数ある可能性があります。
その上、投稿した出力は、投稿したテンプレートコードと一致しません。 _myproject/viewproj?projname=what+up
_は、_projname=...
_がurl_for()
に渡されたことを意味しますが、ビュー関数は_proj=...
_を想定しています
「project.project_name」がテンプレートで正しく解決されているかどうかを確認します。 「プロジェクト」をテンプレートに正しく渡していますか?代わりに 'proj'の値をハードコードして、URLが生成されていることを確認してください。何かのようなもの:-
<a href="{{ url_for('viewproj', proj='new_project') }}">new project</a>