允许烧瓶路径中的所有方法类型

时间:2013-05-17 14:49:57

标签: python flask

如何让路线接受所有类型的方法?

我不仅希望路由标准方法,例如HEADGETPOSTOPTIONSDELETE& PUT

我希望它也接受以下方法:FOOBARWHYISTHISMETHODNAMESOLONG& 每个其他可能的方法名称。

3 个答案:

答案 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