2012-11-18 40 views
7

Tôi muốn có đường dẫn để điều hướng ứng dụng Flask của mình. Một lựa chọn có thể được sử dụng một mô-đun Python chung chung như bread.py:Thực hiện đường dẫn trong Python bằng Flask?

Đối tượng bánh mì chấp nhận một chuỗi url và tài trợ truy cập vào các url mẩu (phần) hoặc liên kết url (danh sách các hrefs cho mỗi cốm).

bread.py tạo đường dẫn từ đường dẫn url, nhưng tôi muốn các phần tử của đường dẫn là tiêu đề và liên kết của các trang đã truy cập trước đó.

Trong bình, có thể điều này có thể được thực hiện bằng cách sử dụng trang trí hoặc bằng cách mở rộng trang trí @route.

Có cách nào để có mỗi cuộc gọi của một số route() thêm tiêu đề và liên kết của trang (được xác định trong hàm/lớp được trang trí với @route) vào đường dẫn không? Có cách nào khác để làm điều đó không? Bất kỳ ví dụ về breadcrumbs thực hiện cho Flask?

Trả lời

10

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 %}&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> 
+0

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

+0

@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

+0

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

Các vấn đề liên quan