2011-12-30 33 views
49

Trong một mẫu, làm thế nào để tôi nhận được trang tôi đang truy cập? Tôi không muốn chuyển một biến số như page, đặc biệt khi tôi biết một số request.xxx có thể cung cấp cho tôi thông tin.Bình: trang hiện tại trong biến yêu cầu

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

Trả lời

50

Miễn là bạn đã nhập request, request.path nên chứa thông tin này.

+3

Lưu ý rằng điều này không đúng cho các biến khác. Nó hoạt động vì 'request' là một trong các biến [được chèn theo mặc định] (http://flask.readthedocs.org/en/latest/templating/#standard-context) vào ngữ cảnh khuôn mẫu. –

42

Yêu cầu nhập đầu tiên từ bình trong ứng dụng của bạn. Sau đó, bạn có thể sử dụng nó mà không đi đến mẫu:

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

'yêu cầu' được nhập (vào tệp' * .py'), vẫn nhận được lỗi: jinja2.exceptions.UndefinedError: 'yêu cầu' không được xác định –

36

Sử dụng request.path dường như không phải là một cách tiếp cận hợp lý vì bạn sẽ phải cập nhật các đường dẫn trong trường hợp thay đổi quy tắc URL hoặc triển khai trang web của bạn dưới một thư mục con.

Sử dụng request.url_rule.endpoint thay vào đó, nó có chứa tên endpoint thực tế không phụ thuộc vào đường dẫn thực tế:

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

Trong một mẫu:

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

Chúc may mắn!

+4

Đây là câu trả lời đúng. Những người khác sử dụng đường dẫn hardcoded, đó là một ý tưởng rất xấu. –

+1

Điều này chỉ hoạt động bạn đang sử dụng một tuyến đường cho mỗi phần của trang. Nếu không, đây sẽ không phải là những gì bạn đang tìm kiếm. = \ – flamusdiu

+0

Không, điều đó không đúng. Bạn có thể có một số cấu trúc trong tên điểm cuối của bạn (như blueprint.subsection.page) và so sánh bằng cách sử dụng .startswith ('blueprint.subsection.'). Chỉ là một ví dụ. – negus

3

Hãy thử

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

một này làm việc cho tôi.

1

Để tránh sử dụng URL mã hóa cứng bạn có thể sử dụng url_for chức năng như thế này:

{% 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 %} 

Trong số trường hợp, foo, thanh này và baz sẽ là tên hàm, được sử dụng như thế này trong mã python của bạn:

@app.route('/') 
def index(): 
Các vấn đề liên quan