首页 文章

使用Flask在Python中实现面包屑?

提问于
浏览
9

我想要面包屑导航我的Flask应用程序 . 一个选项可能是使用像bread.py这样的通用Python模块:

面包对象接受一个url字符串,并授予对url crumbs(部分)或url链接(每个crumb的href列表)的访问权限 .

bread.py从url路径生成breadcrumb,但我希望breadcrumb的元素是以前访问过的页面的 Headers 和链接 .

在Flask中,也许这可以使用装饰器或扩展 @route 装饰器来完成 .

有没有办法让每个调用 route() 添加页面的 Headers 和链接(在用 @route 装饰的函数/类中定义)到面包屑?还有其他方法吗?为Flask实现的任何面包屑示例?

1 回答

  • 11

    所以你要使用"path/history" breadcrumbs而不是"location" breadcrumbs来使用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
    

    在这里's a test application that demonstrates it. Note that I'刚刚使用Flask 's built-in client side session, you' d可能想在 生产环境 中使用更安全的服务器端会话,例如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 %}&raquo;{% 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>
    

相关问题