如何让路线接受所有类型的方法?
我不仅希望路由标准方法,例如HEAD
,GET
,POST
,OPTIONS
,DELETE
& PUT
。
我希望它也接受以下方法:FOOBAR
,WHYISTHISMETHODNAMESOLONG
& 每个其他可能的方法名称。
答案 0 :(得分:10)
您可以直接为此更改url_map,方法是添加Rule
,不使用任何方法:
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
此规则适用的一系列http方法。如果未指定,则允许所有方法。
答案 1 :(得分:2)
见下文,这是一些代码(我已经减少了)from the Flask app object。此代码处理添加网址规则(当您在视图上执行app.route()时,这也是由flask调用的内容)....
@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)
正如您所看到的,Flask将尽最大努力确保方法明确定义。现在,Flask基于Werkzeug和线......
rule = self.url_rule_class(rule, methods=methods, **options)
...通常使用Werkzeug's Rule类。该类具有“methods”参数的以下文档...
此规则适用的一系列http方法。如果没有指定,全部 方法是允许的。
所以,这告诉我你可以做以下的事情......
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
我没有对此进行过测试,但希望这可以让你走上正轨。
修改强>
或者您可以使用DazWorrall的答案,这似乎更好:P
答案 2 :(得分:0)
要快速启用route
的所有HTTP Request Methods而不向Flask url_map
手动添加规则,请按如下所示修改route
定义:
from flask import request
HTTP_METHODS = ['GET', 'HEAD', 'POST', 'PUT', 'DELETE', 'CONNECT', 'OPTIONS', 'TRACE', 'PATCH']
@app.route('/', methods=HTTP_METHODS)
def index():
return request.method