क्या फ्लास्क अपने URL रूटिंग में नियमित अभिव्यक्ति का समर्थन करता है?


100

मैं समझता हूं कि फ्लास्क में इंट, फ्लोट और पथ कन्वर्टर्स हैं, लेकिन हम जो एप्लिकेशन विकसित कर रहे हैं, उसके URL में अधिक जटिल पैटर्न हैं।

क्या कोई तरीका है जिससे हम नियमित अभिव्यक्ति का उपयोग कर सकते हैं, जैसा कि Django में है?

जवाबों:


192

हालांकि अर्मिन ने मुझे एक स्वीकृत जवाब के साथ पंच के लिए हराया, मुझे लगा कि मैं इस बात का संक्षिप्त उदाहरण दिखाऊंगा कि कैसे मैंने फ्लास्क में एक रेगेक्स मैचर को लागू किया, अगर किसी को काम करने का उदाहरण चाहिए तो यह कैसे हो सकता है।

from flask import Flask
from werkzeug.routing import BaseConverter

app = Flask(__name__)

class RegexConverter(BaseConverter):
    def __init__(self, url_map, *items):
        super(RegexConverter, self).__init__(url_map)
        self.regex = items[0]


app.url_map.converters['regex'] = RegexConverter

@app.route('/<regex("[abcABC0-9]{4,6}"):uid>-<slug>/')
def example(uid, slug):
    return "uid: %s, slug: %s" % (uid, slug)


if __name__ == '__main__':
    app.run(debug=True, host='0.0.0.0', port=5000)

यह URL 200 के साथ वापस आ जाना चाहिए: http: // localhost: 5000 / abc0-foo /

यह URL 404: http: // localhost: 5000 / abcd-foo / के साथ वापस आ जाएगा।


4
लेकिन क्या इसका मतलब यह है कि नियमित अभिव्यक्तियों को संकलित किया जाता है, या क्या वे मक्खी पर मूल्यांकन करते हैं?
गेम्स ब्रेनियाक

1
ऐसा लगता है कि रेगेक्स का मूल्यांकन सीधे रनटाइम पर किया जाएगा। यह छोटे ऐप्स (या ऐसे ऐप्स के लिए समस्याग्रस्त नहीं होना चाहिए जो regex के कई बार पुन: उपयोग करते हैं, मुझे लगता है) क्योंकि regex पैटर्न के अंतिम जोड़े को मेमोरी में संकलित किया जाता है।
bbenne10

5
यह कैसे काम करता है? पैटर्न के लिए सेट है self.regex, लेकिन मैच कहाँ होता है?
जस्टिन

@Justin मिलान Werkzeug के इंटर्नल्स में होता है यहां और कहीं-कहीं एक नियम की परिभाषा में जो मुझे नहीं मिला है।
एलेक्सलॉर्ड टॉर्सन

49

आप कस्टम कन्वर्टर्स में हुक कर सकते हैं जो मनमानी अभिव्यक्तियों के लिए मेल खाते हैं: कस्टम कनवर्टर

from random import randrange
from werkzeug.routing import Rule, Map, BaseConverter, ValidationError

class BooleanConverter(BaseConverter):

    def __init__(self, url_map, randomify=False):
        super(BooleanConverter, self).__init__(url_map)
        self.randomify = randomify
        self.regex = '(?:yes|no|maybe)'

    def to_python(self, value):
        if value == 'maybe':
            if self.randomify:
                return not randrange(2)
            raise ValidationError()
        return value == 'yes'

    def to_url(self, value):
        return value and 'yes' or 'no'

url_map = Map([
    Rule('/vote/<bool:werkzeug_rocks>', endpoint='vote'),
    Rule('/vote/<bool(randomify=True):foo>', endpoint='foo')
], converters={'bool': BooleanConverter})

मुझे समझ में नहीं आता कि क्या to_pythonकरता है
corvid

17

आप सभी प्रकार के मार्ग को भी पकड़ सकते हैं और विधि के भीतर जटिल मार्ग कर सकते हैं:

from flask import Flask
app = Flask(__name__)

@app.route('/', methods=['GET', 'POST'], defaults={'path': ''})
@app.route('/<path:path>', methods=['GET', 'POST'])
def catch_all(path):
    return 'You want path: %s' % path

if __name__ == '__main__':
    app.run()

यह किसी भी अनुरोध से मेल खाएगा। अधिक विवरण यहां देखें: कैच-ऑल URL


मेरे पास एक त्रुटि है, क्या आप मुझे कुछ सुराग देंगे? फ़ाइल "/app/catch_all.py", पंक्ति 234, में <मॉड्यूल> @ app.route ('/ <पथ: पथ>', विधियाँ = ['GET']) फ़ाइल "/ usr / स्थानीय / lib / pththon2। 7 / डिस्ट-पैकेज / फ्लास्क / app.py ", लाइन 1080, डेकोरेटर फाइल में" /usr/local/lib/python2.7/dist-packages/flask/app.py ", लाइन 64, आवरण -func फाइल में" / usr / local / lib / python2.7 / dist-package / flask / app.py ", पंक्ति 1051, add_url_rule 'में मौजूदा समापन बिंदु फ़ंक्शन:% s'% समापन बिंदु) जोर: देखें फ़ंक्शन मैपिंग एक मौजूदा समापन बिंदु फ़ंक्शन को अधिलेखित कर रही है: परीक्षण
चिंगारी
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.