Vì vậy, bạn đang theo đường dẫn "đường dẫn/lịch sử", thay vì đường dẫn "vị trí" để sử dụng thuật ngữ từ wikipedia article?
Nếu bạn muốn có quyền truy cập vào lịch sử truy cập của người dùng, thì bạn sẽ phải lưu chúng trong một phiên. Tôi đã tạo ra một trang trí để làm điều này.
breadcrumb.py
:
import functools
import collections
import flask
BreadCrumb = collections.namedtuple('BreadCrumb', ['path', 'title'])
def breadcrumb(view_title):
def decorator(f):
@functools.wraps(f)
def decorated_function(*args, **kwargs):
# Put title into flask.g so views have access and
# don't need to repeat it
flask.g.title = view_title
# Also put previous breadcrumbs there, ready for view to use
session_crumbs = flask.session.setdefault('crumbs', [])
flask.g.breadcrumbs = []
for path, title in session_crumbs:
flask.g.breadcrumbs.append(BreadCrumb(path, title))
# Call the view
rv = f(*args, **kwargs)
# Now add the request path and title for that view
# to the list of crumbs we store in the session.
flask.session.modified = True
session_crumbs.append((flask.request.path, view_title))
# Only keep most recent crumbs (number should be configurable)
if len(session_crumbs) > 3:
session_crumbs.pop(0)
return rv
return decorated_function
return decorator
Và đây là một ứng dụng thử nghiệm đó chứng tỏ nó. Lưu ý rằng tôi vừa mới sử dụng phiên phía máy khách tích hợp của Flask, bạn có thể muốn sử dụng phiên phía máy chủ bảo mật hơn trong sản xuất, chẳng hạn như Flask-KVsession.
#!/usr/bin/env python
import flask
from breadcrumb import breadcrumb
app = flask.Flask(__name__)
@app.route('/')
@breadcrumb('The index page')
def index():
return flask.render_template('page.html')
@app.route('/a')
@breadcrumb('Aardvark')
def pagea():
return flask.render_template('page.html')
@app.route('/b')
@breadcrumb('Banana')
def pageb():
return flask.render_template('page.html')
@app.route('/c')
@breadcrumb('Chimp')
def pagec():
return flask.render_template('page.html')
@app.route('/d')
@breadcrumb('Donkey')
def paged():
return flask.render_template('page.html')
if __name__ == '__main__':
app.secret_key = '83cf5ca3-b1ee-41bb-b7a8-7a56c906b05f'
app.debug = True
app.run()
Và đây là nội dung của templates/page.html
:
<!DOCTYPE html>
<html>
<head><title>{{ g.title }}</title></head>
<body>
<h1>{{ g.title }}</h1>
<p>Breadcrumbs:
{% for crumb in g.breadcrumbs %}
<a href="{{ crumb.path }}">{{ crumb.title }}</a>
{% if not loop.last %}»{% endif %}
{% endfor %}
</p>
<p>What next?</p>
<ul>
<li><a href="/a">Aardvark</a>?</li>
<li><a href="/b">Banana</a>?</li>
<li><a href="/c">Chimp</a>?</li>
<li><a href="/d">Donkey</a>?</li>
</ul>
</body>
</html>
này là tuyệt vời nhưng những gì nếu bạn đang cố gắng làm 'Vị trí' mẩu dựa? bạn cũng có thể thêm câu trả lời cho điều đó không? tôi nghĩ nó sẽ dễ dàng hơn nhiều. – chrickso
@chrisckso: Tôi nghĩ rằng các mẩu vụn dựa trên vị trí là những gì [bread.py] (http://russell.ballestrini.net/a-homegrown-python-bread-crumb-module/) (như đã đề cập trong [câu hỏi] (http://stackoverflow.com/q/13444666/445073)) không? Bạn đã thử chưa – Day
vâng tôi đã nhìn vào nó nhưng không phải là một fan hâm mộ của nó chỉ cần kéo ra khỏi url như tôi muốn tùy chỉnh những gì các từ được. Tôi đang tìm cách đơn giản nhất để làm một trang trí như @breadtrail (['Crumb A', url_for ('...)], [' Crumb B ', url_for (' ...)]) và luôn vượt qua breadtrail var điền dữ liệu đó vào jinja mà không cần phải nhập breadtrail = breadtrail cho mọi tuyến đường. – chrickso