web-dev-qa-db-ja.com

フラスコ:リクエスト変数の現在のページ

テンプレートで、現在どのページにいるかを取得するにはどうすればよいですか? pageのような変数を渡したくない、特にrequest.xxxは情報を提供してくれます。

<li {% if page=="home" %}class="active"{% endif %}>                   
    <a href="/">Home</a>                                                
</li>                                                                 
<li {% if page=="about" %}class="active"{% endif %}>                  
    <a href="/about">About</a>                                          
</li> 
57
atp

requestをインポートしている限り、request.pathにこの情報が含まれている必要があります。

61
ranksrejoined

まず、アプリケーションでflaskからリクエストをインポートします。次に、テンプレートに渡さずにそれを使用できます。

<li {%- if request.path == "/home" %} class="active"{% endif %}>
    <a href="/">Home</a>
</li>
<li {%- if request.path=="/about" %} class="active"{% endif %}>
    <a href="/about">About</a>
</li>
46
Sosiska

URLルールを変更したり、サブフォルダーの下にサイトを展開したりする場合は、パスを更新する必要があるため、request.pathの使用は適切なアプローチではないようです。

代わりにrequest.url_rule.endpointを使用してください。実際のパスに依存しない実際のエンドポイント名が含まれています。

(Pdb) request.url_rule.endpoint
'myblueprint.client_pipeline'

テンプレート内:

<li {% if request.url_rule.endpoint == "myblueprint.client_pipeline" %}class="active"{% endif %}>Home</li>

がんばろう!

43
negus

ハードコードされたURLを使用しないようにするには、url_forこのような関数:

{% for ni in ['index', 'foo', 'bar', 'baz'] %}
<li {%- if request.path == url_for(ni) %} class="active"{% endif %}><a href="{{ url_for(ni) }}">{{ ni | capitalize }}</a></li>
{% endfor %}

この場合、index、foo、bar、bazは関数名になり、pythonコードで次のように使用されます。

@app.route('/')
def index():
6
MoepMan

試してみる

<li {% if request.endpoint == "blueprintname.routename" %}class="active"{% endif %}>Home</li>

これは私のために働いた。

3
iChux

URLにさらに多くのものがある場合は、。splitを使用することもできます。

例:

/製品
/product/add
/product/32432/edit
/product/32432/view

{{request.path.split( '/')[1]}}

これは「製品」のみを返します

0
Iaron