2013-05-17 15 views
5

Come posso consentire a un percorso di accettare tutti i tipi di metodi?Consenti TUTTI i tipi di metodo nel percorso del pallone

Io non voglio solo passare i metodi standard come HEAD, GET, POST, OPTIONS, DELETE & PUT.

mi piacerebbe accettare anche i seguenti metodi: FOOBAR, WHYISTHISMETHODNAMESOLONG & ogni altro possibili nomi di metodo.

risposta

7

È possibile modificare l'url_map direttamente per questo, con l'aggiunta di un Rule senza metodi:

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

Una sequenza di metodi http a cui si applica questa regola. Se non specificato, tutti i metodi sono consentiti.

2

Vedere di seguito, che è un codice (che ho ridotto) from the Flask app object. Questo codice gestisce l'aggiunta di una regola di URL (che è anche quello che viene chiamato dal pallone quando lo si fa app.route() sulla vista) ....

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

Come si può vedere, Flask farà è darndest a assicurarsi che i metodi siano definiti in modo esplicito. Ora, Flask si basa su Werkzeug, e la linea ...

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

... tipicamente utilizza Werkzeug's Rule classe. Questa classe ha la seguente documentazione per l'argomento "metodi" ...

Una sequenza di metodi http a cui si applica questa regola. Se non specificato, tutti i metodi sono consentiti.

Quindi, questo mi dice che si potrebbe essere in grado di fare qualcosa di simile alla seguente ...

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 

non ho ancora testato questo fuori, ma si spera che si può ottenere sulla strada giusta .

Edit:

Oppure si potrebbe usare la risposta di DazWorrall, che sembra meglio: P

+1

Cambiare la url_rule_class funzionerà bene :) Probabilmente è più pulito se si desidera aprire molti (o tutti) percorsi fino a qualsiasi metodo. – DazWorrall

Problemi correlati