10

Flaskアプリをナビゲートするためのブレッドクラムが必要です。オプションとして、 bread.pyのような一般的な Python モジュールを使用することもできます:

パン オブジェクトは URL 文字列を受け入れ、URL クラム (パーツ) または URL リンク (各クラムへの href のリスト) へのアクセスを許可します。

bread.py は URL パスからブレッドクラムを生成しますが、ブレッドクラムの要素を以前にアクセスしたページのタイトルとリンクにしたいと考えています。

Flask では、デコレータを使用するか、デコレータを拡張することでこれを行うことができます@route

を呼び出すたびroute()にページのタイトルとリンク ( で装飾された関数/クラスで定義@route) をブレッドクラムに追加する方法はありますか? それを行う他の方法はありますか?Flask に実装されたブレッドクラムの例はありますか?

4

2 に答える 2

12

つまり、ウィキペディアの記事の用語を使用するために、「場所」のパンくずリストではなく、「パス/履歴」のパンくずリストを探しているのでしょうか。

ユーザーがアクセスしたリンクの履歴にアクセスしたい場合は、それらをセッションに保存する必要があります。私はこれを行うためのデコレータを作成することに挑戦しました。

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 %}&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>
于 2012-11-30T00:07:07.883 に答える