2011-08-17 12 views
17

Wygląda na to, że Flask nie obsługuje tras z komponentem zakodowanym w URI. Jestem ciekawy, czy robię coś nie tak, czy też jest specjalna flaga, którą muszę uwzględnić.Trasa kolbowa z komponentem kodowanym URI

Moja droga wygląda mniej więcej tak:

@app.route('/foo/<encoded>/bar/') 
def foo(encoded): 
    # ... 
    pass 

URL, że powinno to pasuje może wyglądać takie jak:

http://foobar.com/foo/xxx/bar/ # matched correctly, no URI component 
http://foobar.com/foo/x%2Fx%2Fx%2F/bar/ # not matched correctly, URI component 

Dawne prace URL, ostatni wypluwa piękny 404.

Dzięki!

Odpowiedz

24

dodawania path do reguły URL:

@app.route('/foo/<path:encoded>/bar/')

Aktualizacja na komentarz: Trasa docs API tutaj: http://flask.pocoo.org/docs/api/#flask.Flask.route. Bazowe klasy, które implementują path stylu konwerter trasy są tutaj: http://werkzeug.pocoo.org/docs/routing/#custom-converters (. Jest to jeden z naprawdę ładnymi częściach pocoostan) Jeśli chodzi o końcowe ukośniki, istnieją specjalne zasady, które wynoszą:

Jeśli reguła kończy się ukośnikiem i jest żądana bez ukośnika przez użytkownika , użytkownik jest automatycznie przekierowywany na tę samą stronę z dołączonym końcowym ukośnikiem .

Jeśli reguła nie kończy się na ukośnym ukośniku, a użytkownik poprosi o stronę z ukośnym ukośnikiem, zostanie znaleziony błąd 404.

Należy także pamiętać, że jeśli jesteś na Apache i spodziewa się ukośnik-ciągniona URL, czyli bookmarklet że przedkłada http://ex.com/foo/<path:encoded>/bar i encoded dostaje coś z podwójnych ukośników, Apache będzie konwertować wiele ukośniki do jednego.

+0

Rad, to naprawiło. – sholsapp

+3

W przypadku, gdy ktoś inny ma ten sam problem: zajęło mi minutę, aby zdać sobie sprawę, że dodawaliśmy 'path', nie dodając' encoded'. Próbowałem i nie dodałem "zakodowanego" filtru końcowego zamiast "wstępnego" ścieżki. – gwg

+0

ty i ja! –

Powiązane problemy