2012-05-10 7 views
8

एक फ्लास्क खाका के अंदर, मेरे पास है:फ्लास्क ब्लूप्रिंट का उपयोग करके, उपडोमेन निर्दिष्ट किए जाने पर url_for को तोड़ने से कैसे ठीक करें?

frontend = Blueprint('frontend', __name__) 

और मेरी सूचकांक समारोह के लिए रास्ते में है:

@frontend.route('/') 
def index(): 
    #code 

यह ठीक काम करता है लेकिन, मैं रूट करने के लिए एक उप डोमेन जोड़ने की कोशिश कर रहा हूँ, इसलिए जैसे:

@frontend.route('/', subdomain='<var>') 
def index(var): 

लेकिन इस एप्लिकेशन टूट जाता है और ब्राउज़र बाहर थूक (अन्य बातों के साथ):

+०१२३५१६४१०
werkzeug.routing.BuildError 
BuildError: ('frontend.index', {}, None) 

frontend.index एक url_for ('frontend.index')

मैं कैसे url_for काम करने के लिए जब मैं एक उप डोमेन शामिल कर रहा हूँ प्राप्त कर सकते हैं में कुछ स्थानों में मेरी कोड में बाहर कहा जाता है? दस्तावेजों में केवल एक चीज मैं पा सकते हैं और मुझे लगता है कि प्रासंगिक हो सकता है यह है http://flask.pocoo.org/docs/api/ के तहत:

अनुप्रयोगों को एकीकृत करने के लिए, बोतल यूआरएल Flask.build_error_handler के माध्यम से त्रुटियों का निर्माण बीच में रोकने का एक हुक है। Url_for फ़ंक्शन परिणाम BuildError में जब वर्तमान ऐप में दिए गए एंडपॉइंट और मानों के लिए कोई URL नहीं है। जब ऐसा होता है, तो current_app अपने build_error_handler को कॉल करता है यदि यह कोई नहीं है, जो पर स्ट्रिंग को url_for के परिणाम के रूप में उपयोग कर सकता है ( BuildError अपवाद बढ़ाने के लिए url_for के डिफ़ॉल्ट के बजाय) या अपवाद को फिर से उठाएं। एक उदाहरण:

def external_url_handler(error, endpoint, **values): 
    "Looks up an external URL when `url_for` cannot build a URL." 
    # This is an example of hooking the build_error_handler. 
    # Here, lookup_url is some utility function you've built 
    # which looks up the endpoint in some external URL registry. 
    url = lookup_url(endpoint, **values) 
    if url is None: 
     # External lookup did not have a URL. 
     # Re-raise the BuildError, in context of original traceback. 
     exc_type, exc_value, tb = sys.exc_info() 
     if exc_value is error: 
      raise exc_type, exc_value, tb 
     else: 
      raise error 
    # url_for will use this result, instead of raising BuildError. 
    return url 

app.build_error_handler = external_url_handler 

हालांकि, मैं अजगर (और प्रोग्रामिंग) के लिए नया हूँ और समझ में नहीं आ सकते हैं, जहां मैं इस कोड डाल या कैसे मैं उस समारोह में जब एक builderror होता है कॉल करने के लिए मिलेगा।

किसी भी अंतर्दृष्टि बहुत सराहना की जाएगी :)

+0

आप अपने url_for को जोड़ने की कोशिश की '' _external = True'' है() कहते हैं? –

+0

@chrickso: मेरा जवाब देखें। ऐसा लगता है, आपको बस अलग-अलग विधि नाम प्रदान करने की आवश्यकता है। – pyfunc

उत्तर

13

पहले, उप डोमेन का उपयोग करने के SERVER_NAME configuration के लिए एक मूल्य की आवश्यकता है:

app.config['SERVER_NAME'] = 'example.net' 

आप इस प्रकार का दृश्य है:

frontend = Blueprint('frontend', __name__) 
@frontend.route('/', subdomain='<var>') 
def index(var): 
    return ... 

आदेश इस दृष्टिकोण के यूआरएल को फिर से संगठित करने के लिए , फ्लास्क को var के लिए एक मान की आवश्यकता है। url_for('frontend.index') विफल हो जाएगा क्योंकि इसमें पर्याप्त मूल्य नहीं हैं। उपरोक्त SERVER_NAME के ​​साथ, url_for('frontend.index', var='foo')http://foo.example.net/ वापस आ जाएगा।

-3

मुझे नहीं लगता कि इस बोतल के साथ कोई समस्या है।

आप एक ही विधि का नाम के साथ दो कार्यों प्रदान कर रहे हैं:

@frontend.route('/') 
def index(): 
    #code 

और

@frontend.route('/', subdomain='<var>') 
def index(var): 

वे अलग तरह से लिपटे रहे हैं, लेकिन जब flask.build_url कहा जाता है, यह अतिभारित समारोह नाम की वजह से फेंक रहा है । यह पहली नज़र में गलत लगता है।

तरह

@frontend.route('/', subdomain='<var>') 
def index_var(var): 

यह दूसरा एक के लिए एक अलग समारोह नाम उपलब्ध कराने के अपने मुद्दे को हल कर सकते हैं की कोशिश करो। हालांकि मैंने इसका परीक्षण नहीं किया है।

9

url_for में ब्लूप्रिंट नाम जोड़ें। उदाहरण:

url_for('pay_sermepa.sermepa_cancel', _external=True) 
  • pay_sermepa: खाका नाम
  • sermepa_cancel: मार्ग
संबंधित मुद्दे

 संबंधित मुद्दे