Flask có hỗ trợ các cụm từ thông dụng trong định tuyến URL của nó không?


100

Tôi hiểu rằng Flask có các bộ chuyển đổi int, float và path, nhưng ứng dụng chúng tôi đang phát triển có nhiều mẫu phức tạp hơn trong các URL của nó.

Có cách nào chúng ta có thể sử dụng biểu thức chính quy, như trong Django không?

Câu trả lời:


192

Mặc dù Armin đã đánh bại tôi với một câu trả lời được chấp nhận, tôi nghĩ rằng tôi sẽ hiển thị một ví dụ viết tắt về cách tôi triển khai một trình đối sánh regex trong Flask chỉ trong trường hợp bất kỳ ai muốn một ví dụ làm việc về cách điều này có thể được thực hiện.

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 này phải trả về 200: http: // localhost: 5000 / abc0-foo /

URL này sẽ trả về 404: http: // localhost: 5000 / abcd-foo /


4
Nhưng điều này có nghĩa là các biểu thức chính quy được biên dịch hay chúng được đánh giá nhanh chóng?
Trò chơi Brainiac

1
Điều này có vẻ như regex sẽ được đánh giá trực tiếp trong thời gian chạy. Điều này không thành vấn đề đối với các ứng dụng nhỏ hơn (hoặc các ứng dụng sử dụng lại nhiều lần regex, tôi nghĩ vậy) vì một vài mẫu regex cuối cùng được lưu trữ trong bộ nhớ.
bbenne10

5
Cái này hoạt động ra sao? Mẫu được đặt thành self.regex, nhưng khớp sẽ xảy ra ở đâu?
Justin

@Justin Sự phù hợp xảy ra trong nội bộ của Werkzeug Ở đây và ở đâu đó trong định nghĩa của quy tắc mà tôi chưa tìm thấy.
AlexLordThorsen

49

Bạn có thể treo trong bộ chuyển đổi tùy chỉnh phù hợp cho các biểu thức tùy ý: Tuỳ chỉnh chuyển đổi

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})

Tôi không hiểu chuyện gì to_pythonxảy ra
corvid

17

Bạn cũng có thể viết một bắt tất cả các loại tuyến đường và thực hiện định tuyến phức tạp trong phương thức:

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()

Điều này sẽ phù hợp với bất kỳ yêu cầu nào. Xem thêm chi tiết tại đây: URL Catch-All .


Tôi có một lỗi, bạn có thể cho tôi một số manh mối? Tệp "/app/catch_all.py", dòng 234, trong <module> @ app.route ('/ <path: path>', method = ['GET']) Tệp "/ usr / local / lib / python2. 7 / dist-pack / flask / app.py ", dòng 1080, trong tệp decorator" /usr/local/lib/python2.7/dist-packages/flask/app.py ", dòng 64, trong tệp wrapper_func" / usr / local / lib / python2.7 / dist-pack / flask / app.py ", dòng 1051, trong hàm điểm cuối hiện tại của add_url_rule:% s '% endpoint) AssertionError: Xem ánh xạ hàm đang ghi đè lên một hàm điểm cuối hiện có: test
spark
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.