2013-05-17 27 views
5

Làm cách nào để cho phép tuyến đường chấp nhận tất cả các loại phương pháp?Cho phép TẤT CẢ các loại phương pháp trong tuyến đường gom

Tôi không chỉ muốn để định tuyến các phương pháp tiêu chuẩn như HEAD, GET, POST, OPTIONS, DELETE & PUT.

Tôi cũng muốn chấp nhận các phương pháp sau: FOOBAR, WHYISTHISMETHODNAMESOLONG & mỗi tên khác có thể là.

Trả lời

7

Bạn có thể thay đổi url_map trực tiếp cho điều này, bằng cách thêm một Rule không có phương pháp:

from flask import Flask, request 
import unittest 
from werkzeug.routing import Rule 

app = Flask(__name__) 
app.url_map.add(Rule('/', endpoint='index')) 

@app.endpoint('index') 
def index(): 
    return request.method 


class TestMethod(unittest.TestCase): 

    def setUp(self): 
     self.client = app.test_client() 

    def test_custom_method(self): 
     resp = self.client.open('/', method='BACON') 
     self.assertEqual('BACON', resp.data) 

if __name__ == '__main__': 
    unittest.main() 

methods

Một chuỗi các phương thức http mà quy tắc này áp dụng. Nếu không được chỉ định, tất cả các phương thức đều được cho phép.

2

Xem bên dưới, đây là một số mã (mà tôi đã cắt bớt) from the Flask app object. Mã này handle thêm một quy tắc url (được cũng là những gì được gọi bằng bình khi bạn làm app.route() trên quan điểm của bạn) ....

@setupmethod 
def add_url_rule(self, rule, endpoint=None, view_func=None, **options): 
    """ I remove a ton the documentation here.... """ 

    if endpoint is None: 
     endpoint = _endpoint_from_view_func(view_func) 
    options['endpoint'] = endpoint 
    methods = options.pop('methods', None) 

    # if the methods are not given and the view_func object knows its 
    # methods we can use that instead. If neither exists, we go with 
    # a tuple of only `GET` as default. 
    if methods is None: 
     methods = getattr(view_func, 'methods', None) or ('GET',) 
    methods = set(methods) 

    # ... SNIP a bunch more code... 
    rule = self.url_rule_class(rule, methods=methods, **options) 
    rule.provide_automatic_options = provide_automatic_options 

    self.url_map.add(rule) 

Như bạn thấy, Flask sẽ làm điều đó là để darndest đảm bảo rằng các phương pháp được xác định rõ ràng. Bây giờ, Flask dựa trên Werkzeug và dòng ...

rule = self.url_rule_class(rule, methods=methods, **options) 

... thường sử dụng Werkzeug's Rule lớp. Lớp này có tài liệu sau cho đối số "phương thức" ...

Một chuỗi các phương pháp http áp dụng quy tắc này. Nếu không được chỉ định, tất cả các phương thức đều được cho phép.

Vì vậy, điều này nói với tôi rằng bạn có thể làm điều gì đó như sau ...

from werkzeug.routing import Rule 

app = Flask(__name__) 

def my_rule_wrapper(rule, **kwargs): 
    kwargs['methods'] = None 
    return Rule(rule, **kwargs) 

app.url_rule_class = my_rule_wrapper 

tôi đã không kiểm tra này ra, nhưng hy vọng có thể giúp bạn đi đúng hướng .

Edit:

Hoặc bạn chỉ có thể sử dụng câu trả lời DazWorrall, mà dường như tốt hơn: P

+1

Thay đổi url_rule_class cũng sẽ hoạt động tốt :) Nó có thể sạch hơn nếu bạn muốn mở nhiều (hoặc tất cả) tuyến đường lên đến bất kỳ phương pháp nào. – DazWorrall

Các vấn đề liên quan