2013-10-06 2 views
6

क्या url_for ब्लूप्रिंट में काम करता है?ब्लूप्रिंट्स पर url_for का उपयोग

/flaskapp 
    /runserver.py   (from server import app; app.run(debug=True)) 
    /server 
     /__init__.py  (app = Flask(__name__)) 
     /pages 
      /__init__.py ('pages' blueprint) 
     /users 
      /__init__.py ('users' blueprint) 
server/__init__.py में

:

server/pages/__init__.py में
from server.pages import pages 
from server.users import users 

app = Flask(__name__) 

app.register_blueprint(pages) 
app.register_blueprint(users) 

:

server/users/__init__.py में
pages = Blueprint('pages', __name__) 

@pages.route('/') 
def index(): return '<h1>Index</h1>' 

:

users = Blueprint('users', __name__) 

@users.route('/login') 
def login(): 
    ... 
    return redirect(url_for('pages.index')) 
        ^^^^^^^^^^^^^^^^^^^^^^ 

url_for कॉल BuildError: ('pages.index', {}, None) 'pages.index' पर जाने का तरीका क्या होगा?

(मैं मॉड्यूल आयात करने की कोशिश की, लेकिन बात नहीं बनी)

+1

मैंने फ्लास्क 0.10.1 के साथ अपना उदाहरण आजमाया है और समस्या को फिर से बनाने में असमर्थ हूं। ऐसा प्रतीत होता है जैसे इसे काम करना चाहिए, शायद आपने प्रश्न से बाहर कुछ कोड छोड़ दिया है जो वास्तव में महत्वपूर्ण है? यदि संभव हो, तो एक पायथन फ़ाइल में समस्या को फिर से बनाने का प्रयास करें और उस पायथन फ़ाइल को पोस्ट करें। साथ ही, अपने app.debug से पहले, कंसोल 'app.url_map' पर प्रिंट करें, जो एंडपॉइंट्स के लिए सभी नियमों को सूचीबद्ध करेगा। –

उत्तर

3

लघु उत्तर: हाँ

लांग (ish) उत्तर:

के रूप में सबसे अच्छा मैं बता सकता हूँ, आप का आयोजन कर रहे हैं आपका ऐप आपको जिस तरह से करना चाहिए।

मैंने आपके सेटअप को फिर से बनाया है (यद्यपि एक फ़ाइल में), जिसे आप यहां चेकआउट कर सकते हैं। यह कोड मेरी मशीन पर चलता है।

https://gist.github.com/enlore/80bf02346d6cabcba5b1

कुप्पी में, आप किसी विशेष दृश्य के समारोह, स्वामित्व वाली खाका के भीतर से एक रिश्तेदार endpoint (.login), या एक साथ एक निरपेक्ष एक (user.login) कहीं भी के माध्यम से पहुँच सकते हैं।

मेरा पैसा आपके पास फ़ंक्शन नाम में एक टाइपो है।

मार्क हिल्डरेथ की तरह टिप्पणियों में कहा गया है कि आपकी समस्या को डीबग करने का एक शानदार तरीका आपके यूआरएल मानचित्र को देखना होगा।

>>> from app import app 
>>> app.url_map 
Map([<Rule '/login' (HEAD, OPTIONS, GET) -> user.login>, 
<Rule '/' (HEAD, OPTIONS, GET) -> pages.index>, 
<Rule '/static/<filename>' (HEAD, OPTIONS, GET) -> static>]) 
>>> 
2

आप url_value_preprocessor उपयोग कर रहे हैं सुनिश्चित करें कि आप सही ढंग से url_defaults सेट कर रहे हैं अन्यथा url_for यूआरएल का निर्माण करने के लिए पर्याप्त मान नहीं होगा और आप इस काफी भ्रमित त्रुटि संदेश मिलता है।

उदाहरण।

@bp.url_value_preprocessor 
def get_project(endpoint, values): 
    project_name = values.pop('project_name') 
    g.project = Project.query.filter_by(name=project_name).first_or_404() 

@bp.url_defaults 
def add_project(endpoint, values): 
    if 'project_name' in values or not g.project: 
     return 
    values['project_name'] = g.project.name 
संबंधित मुद्दे