ফ্লাস্ক কি এর ইউআরএল রাউটে নিয়মিত প্রকাশকে সমর্থন করে?


100

আমি বুঝতে পারি যে ফ্লাস্কের অন্তর্নিহিত, ভাসমান এবং পাথ রূপান্তরকারী রয়েছে তবে আমরা যে অ্যাপ্লিকেশনটি বিকাশ করছি তার URL গুলিতে আরও জটিল নিদর্শন রয়েছে।

জাঙ্গোর মতো আমরা কীভাবে নিয়মিত ভাব প্রকাশ করতে পারি?

উত্তর:


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)

এই ইউআরএলটি 200: http: // লোকালহোস্ট: 5000 / abc0-foo / দিয়ে ফিরে আসা উচিত

এই ইউআরএল 404: http: // লোকালহোস্ট: 5000 / abcd-foo / দিয়ে ফিরে আসবে


4
তবে এর অর্থ কি এই যে নিয়মিত প্রকাশগুলি সংকলিত হয়, না তারা ফ্লাইয়ে মূল্যায়ন করা হয়?
গেমস ব্রেনিয়াক

1
দেখে মনে হচ্ছে রেগেক্স সরাসরি রানটাইমে মূল্যায়ন করা হবে। এটি ছোট অ্যাপ্লিকেশনগুলির জন্য সমস্যাযুক্ত হওয়া উচিত নয় (বা এমন অ্যাপ্লিকেশনগুলি যা রিজেজের একাধিকবার পুনরায় ব্যবহার করে, আমি মনে করি) যেহেতু শেষ দুটি রেগেক্স নিদর্শনগুলি মেমরিতে সংকলিত রয়েছে।
বিবিএন 10

5
কিভাবে কাজ করে? প্যাটার্নটি সেট করা self.regexআছে তবে ম্যাচটি কোথায় ঘটে?
জাস্টিন

@ জাস্টিন ম্যাচটি ওয়ার্কজেগের অভ্যন্তরীণ জায়গায় এখানে এবং কোথাও কোথাও পাওয়া যায় নি এমন একটি নিয়মের সংজ্ঞাতে।
অ্যালেক্সLordThorsen

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


আমার একটি ত্রুটি আছে, আপনি আমাকে কিছু সংকেত দেবেন? <module> @ app.route ('/ <पथ: পথ>', পদ্ধতিসমূহ = ['জিইটি']) ফাইল "/app/catch_all.py", লাইন 234, ফাইল "/ usr / স্থানীয় / lib / পাইথন 2। 7 / ডিস্ট-প্যাকেজ / ফ্লাস্ক / অ্যাপ.পি ", লাইন 1080, ডেকোরিটার ফাইলে" /usr/local/lib/python2.7/dist-packages/flask/app.py ", লাইন 64, র‌্যাপার_ফান্ক ফাইলটিতে" / usr / local / lib / python2.7 / dist-প্যাকেজস / flask / app.py ", লাইন 1051, add_url_rule 'বিদ্যমান শেষ বিন্দু ফাংশন:% s'% শেষ পয়েন্টে) দৃ ma়তা ত্রুটি: দেখুন ফাংশন ম্যাপিং একটি বিদ্যমান শেষ বিন্দু ফাংশন ওভাররাইট করছে: পরীক্ষা
স্পার্ক করুন
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.