2012-11-18 37 views
7

मैं अपने Flask ऐप पर नेविगेट करने के लिए ब्रेडक्रंब चाहता हूं। एक विकल्प bread.py की तरह एक सामान्य पायथन मॉड्यूल का उपयोग करने से हो सकता है:फ्लास्क का उपयोग कर पायथन में ब्रेडक्रंब को कार्यान्वित करना?

रोटी वस्तु एक यूआरएल स्ट्रिंग स्वीकार करता है और अनुदान (प्रत्येक टुकड़ा करने के लिए hrefs की सूची) टुकड़ों (भागों) या यूआरएल लिंक यूआरएल के लिए पहुँच।

bread.py यूआरएल पथ से ब्रेडक्रंब उत्पन्न करता है, लेकिन मैं चाहता हूं कि ब्रेडक्रंब के तत्व पहले से देखे गए पृष्ठों का शीर्षक और लिंक हों।

फ्लास्क में, शायद यह एक सजावट का उपयोग करके या @route सजावट का विस्तार करके किया जा सकता है।

क्या route() के प्रत्येक कॉल को पृष्ठ का शीर्षक और लिंक जोड़ने के लिए कोई तरीका है (@route से सजाए गए फ़ंक्शन/वर्ग में परिभाषित) ब्रेडक्रंब में? क्या ऐसा करने के अन्य तरीके हैं? फ्लास्क के लिए लागू ब्रेडक्रंब के किसी भी उदाहरण?

उत्तर

10

तो आप 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-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> 
+0

इस भयानक है, लेकिन क्या अगर आप 'स्थान' आधारित टुकड़ों करने के लिए कोशिश कर रहे हैं? क्या आप इसके लिए भी एक जवाब जोड़ सकते हैं? मुझे लगता है कि यह बहुत आसान होगा। – chrickso

+0

@chrisckso: मुझे लगता है कि 'स्थान' आधारित crumbs क्या है [bread.py] (http://russell.ballestrini.net/a-homegrown-python-bread-crumb-module/) (जैसा कि [प्रश्न] में उल्लिखित है] (http://stackoverflow.com/q/13444666/445073)) करता है? क्या आपने कोशिश की है? – Day

+0

हां मैंने इसे देखा लेकिन मैं इसके प्रशंसक नहीं हूं कि सिर्फ यूआरएल खींच रहा हूं क्योंकि मैं शब्दों को अनुकूलित करना चाहता हूं। मैं @ ब्रेडट्रिल (['क्रंब ए', url_for ('...)], [' क्रंब बी ', url_for (' ...)] जैसे सजावट करने का सबसे आसान तरीका ढूंढ रहा हूं) और हमेशा एक पास प्रत्येक मार्ग के लिए breadtrail = breadtrail टाइप किए बिना जिन्जा को उस डेटा से भरा हुआ ब्रेडट्रिल var। – chrickso