我想用面包屑浏览我的Flask应用。一个选项可能是使用像bread.py这样的通用Python模块:
bread对象接受url字符串并授予对url的访问权限 crumbs(parts)或url links(每个crumb的hrefs列表)。
bread.py从url路径生成breadcrumb,但我希望breadcrumb的元素是以前访问过的页面的标题和链接。
在Flask中,也许这可以使用装饰器或扩展@route
装饰器来完成。
有没有办法让route()
的每次调用都将页面的标题和链接(在用@route
修饰的函数/类中定义)添加到面包屑中?还有其他方法吗?为Flask实现的任何面包屑示例?
答案 0 :(得分:11)
所以你要追踪“路径/历史”面包屑,而不是“位置”面包屑来使用wikipedia article中的术语?
如果您想要访问用户访问过的链接的历史记录,那么您将不得不将它们保存在会话中。我已经开始创建一个装饰器来做到这一点。
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
这是一个演示它的测试应用程序。请注意,我刚刚使用了Flask的内置客户端会话,您可能希望在生产中使用更安全的服务器端会话,例如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()
以下是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>
答案 1 :(得分:0)
我试图使用面包屑.py,但我需要检查:
如果会话碎屑中已经存在新项目“item = (flask.request.path, view title)”,那么我将从索引中删除所有其他项目到最后,我这样做是为了避免在我的会话过程中重复。
flask.session.modified = True
item = (flask.request.path, view_title)
try:
if not item in session_crumbs:
session_crumbs.append(item)
else:
index = session_crumbs.index(item)
session_crumbs = session_crumbs[:index+1]
except:
pass
return rv
return decorated_function
return decorator