2016-11-01 6 views
6

में ट्रायलिंग स्लैश उदाहरण के लिए निम्नलिखित दो मार्ग लें।फ्लास्क मार्ग

app = Flask(__name__) 

@app.route("/somewhere") 
def no_trailing_slash(): 
    #case one 

@app.route("/someplace/") 
def with_trailing_slash(): 
    #case two 

the docs के अनुसार निम्नलिखित समझा जाता है:

  • मामले से एक में, मार्ग "/somewhere/" के लिए एक अनुरोध 404 प्रतिक्रिया वापस आ जाएगी। "/somewhere" मान्य है।

  • दो मामले में, "/someplace/" वैध है और "/someplace""/someplace/"

व्यवहार मैं देखना चाहेंगे 'उलटा' मामले दो व्यवहार के है पर रीडायरेक्ट करेगा। जैसे "/someplace/" आसपास के अन्य तरीकों की बजाय "/someplace" पर रीडायरेक्ट करेगा। क्या इस व्यवहार को लेने के लिए मार्ग निर्धारित करने का कोई तरीका है?

मेरी समझ से, strict_slashes=False मामले में प्रभावी रूप से दो मामले का एक ही व्यवहार पाने के लिए मार्ग पर सेट किया जा सकता है, लेकिन मैं क्या करना चाहते हैं हमेशा बिना यूआरएल पर रीडायरेक्ट करने रीडायरेक्ट व्यवहार मिलता है पिछला स्लैश

एक समाधान जिसे मैंने उपयोग करने के बारे में सोचा है, 404 के लिए एक त्रुटि हैंडलर का उपयोग करेगा, ऐसा कुछ। (अगर यह भी काम करेगा सुनिश्चित नहीं हैं)

@app.errorhandler(404) 
def not_found(e): 
    if request.path.endswith("/") and request.path[:-1] in all_endpoints: 
     return redirect(request.path[:-1]), 302 
    return render_template("404.html"), 404 

लेकिन वहाँ एक बेहतर समाधान नहीं है, तो किसी प्रकार की एक बूंद-इन एप्लिकेशन विन्यास, strict_slashes=False के समान है कि मैं विश्व स्तर पर लागू कर सकते हैं की तरह मैं सोच रहा हूँ। शायद एक ब्लूप्रिंट या यूआरएल नियम?

+0

दोनों अलग से लागू करने और राशि '/ somplace/प्रत्येक मार्ग के लिए लागू किया जा करने के लिए आप विशेष तर्क की आवश्यकता नहीं करने की अनुमति देगा' '/ someplace' को अनुप्रेषित? – Busturdust

+0

मैंने जो देखा है वह है जब आपके पास अपने फ्लास्क कॉन्फ़िगरेशन में 'DEBUG = True' है, पीछे की जगहों को पुनर्निर्देशित नहीं किया जाता है, लेकिन जब 'DEBUG = गलत' होता है तो इसे पुनर्निर्देशित किया जाता है। –

+0

@ बुस्टर्डस्ट जो शायद काम कर सकता है, लेकिन प्रबंधन के लिए दर्द का एक प्रकार होगा। कुछ अन्य विचारों में मैंने एक [त्रुटि हैंडलर] (http://flask.pocoo.org/docs/0.11/patterns/errorpages/#error-handlers) का उपयोग करना शामिल किया है जो स्लैशलेस एंडपॉइंट मौजूद होने पर रीडायरेक्ट लौटाता है। किसी प्रकार के ब्लूप्रिंट का उपयोग करना भी संभव हो सकता है। लेकिन मैं पहले से ही किसी और के लिए 404 त्रुटि हैंडलर का उपयोग करता हूं (इसे बेक किया जा सकता है, लेकिन मैं नहीं चाहता) और मुझे यकीन नहीं है कि यह ब्लूप्रिंट के साथ हासिल किया जा सकता है या नहीं। आदर्श समाधान वैश्विक यूआरएल नियम की तरह एक ड्रॉप-इन होगा। – sytech

उत्तर

11

आप strict_slashes का उपयोग कर सही ट्रैकिंग पर हैं, जिसे आप स्वयं फ्लास्क ऐप पर कॉन्फ़िगर कर सकते हैं। यह हर मार्ग कि

app = Flask('my_app') 
app.url_map.strict_slashes = False 

बनाई गई है तो फिर तुम before_request का उपयोग एक रीडायरेक्ट के लिए अनुगामी / पता लगाने के लिए कर सकते हैं के लिए False को strict_slashes ध्वज सेट हो जाएगा। before_request का उपयोग करते हुए अलग-अलग

@app.before_request 
def clear_trailing(): 
    from flask import redirect, request 

    rp = request.path 
    if rp != '/' and rp.endswith('/'): 
     return redirect(rp[:-1]) 
+0

निश्चित रूप से, मुझे यह बहुत कुछ पता चला है। हालांकि, यह पीछे * स्लैश के साथ यूआरएल * पर रीडायरेक्ट करेगा। गैर-पिछला स्लैश के लिए अनुरोध 302 रीडायरेक्ट होंगे। मैं पिछला स्लैश गैर-पीछे वाले स्लैश यूआरएल पर रीडायरेक्ट करना चाहता हूं। – sytech

+1

@sytech मेरे अपडेट देखें – Wondercricket

+1

यह दिलचस्प लगता है। यह शायद समाधान के लिए काम कर सकता है। अगर मैंने यह दृष्टिकोण लिया है, तो शायद मैं यह देखने के लिए जांच करूँगा कि स्लैश * कम * मार्ग वहां रीडायरेक्ट करने से पहले मौजूद है, एक यूआरएल पर रीडायरेक्ट करने से बचने के लिए जो आखिरकार 404 होगा। लेकिन हाँ, यह अच्छा लग रहा है। मुझे यकीन नहीं है कि मैं प्रत्येक मार्ग * के लिए प्रत्येक बार * चलाने के लिए फ़ंक्शन पंजीकृत करने के बारे में कैसा महसूस करता हूं। मैं 404 त्रुटि हैंडलर का उपयोग करने के खिलाफ इसका वजन कर रहा हूं जो जांच करेगा कि स्लैशलेस मार्ग मौजूद है या नहीं, जो मुझे लगता है कि 404 होता है और इसकी तुलना में प्रदर्शन प्रभाव हो सकता है या नहीं। – sytech