Szukaj…


Podstawowe trasy

Trasy w Flask można zdefiniować za pomocą dekoratora route instancji aplikacji Flask:

app = Flask(__name__)

@app.route('/')
def index():
    return 'Hello Flask'

Dekorator route pobiera ciąg, który jest adresem URL do dopasowania. Gdy aplikacja otrzyma żądanie adresu URL pasującego do tego ciągu, wywoływana jest funkcja ozdobiona (zwana również funkcją widoku ). Tak więc, jeśli chodzi o trasę, mielibyśmy:

@app.route('/about')
def about():
    return 'About page'

Należy zauważyć, że te trasy nie są wyrażeniami regularnymi, tak jak w Django.

Możesz także zdefiniować reguły zmiennych, aby wyodrębnić wartości segmentów adresów URL do zmiennych:

@app.route('/blog/posts/<post_id>')
def get_blog_post(post_id):
    # look up the blog post with id post_id
    # return some kind of HTML

Tutaj reguła zmiennej znajduje się w ostatnim segmencie adresu URL. Niezależnie od wartości jest w ostatnim segmencie adresu URL zostanie przekazany do funkcji widoku ( get_blog_post ) jako post_id parametru. Zatem żądanie do /blog/posts/42 pobierze (lub spróbuje pobrać) post z bloga o identyfikatorze 42.

Powszechne jest również ponowne wykorzystywanie adresów URL. Na przykład może chcemy, aby /blog/posts zwracały listę wszystkich postów na blogu. Moglibyśmy mieć dwie trasy dla tej samej funkcji widoku:

@app.route('/blog/posts')
@app.route('/blog/posts/<post_id>')
def get_blog_post(post_id=None):
    # get the post or list of posts

Zauważmy, że mamy również dostarczyć domyślną wartość None dla post_id w get_blog_post . Po dopasowaniu pierwszej trasy nie będzie żadnej wartości do przekazania do funkcji widoku.

Zauważ też, że domyślnie typ reguły zmiennej jest łańcuchem. Można jednak podać kilka różnych typów, takich jak int i float , poprzedzając zmienną:

@app.route('/blog/post/<int:post_id>')

Wbudowane konwertery URL Flask to:

string | Accepts any text without a slash (the default).
int    | Accepts integers.
float  | Like int but for floating point values.
path   | Like string but accepts slashes.
any    | Matches one of the items provided
uuid   | Accepts UUID strings

Jeśli spróbujemy odwiedzić adres URL /blog/post/foo z wartością w ostatnim segmencie adresu URL, której nie można przekonwertować na liczbę całkowitą, aplikacja zwróci błąd 404. Jest to prawidłowe działanie, ponieważ nie ma reguły z /blog/post i łańcuchem w ostatnim segmencie.

Wreszcie trasy można skonfigurować tak, aby akceptowały również metody HTTP. Dekorator route przyjmuje argument słowa kluczowego methods który jest listą ciągów znaków reprezentujących dopuszczalne metody HTTP dla tej trasy. Jak można przypuszczać, domyślną wartością jest tylko GET . Gdybyśmy mieli formularz, aby dodać nowy post na blogu i chcieliśmy zwrócić HTML dla żądania GET i przeanalizować dane formularza dla POST , trasa wyglądałaby mniej więcej tak:

@app.route('/blog/new', methods=['GET', 'POST'])
def new_post():
    if request.method == 'GET':
        # return the form
    elif request.method == 'POST':
        # get the data from the form values

request znajduje się w opakowaniu flask . Zauważ, że używając argumentu methods , musimy wyraźnie wyrazić zgodę na metody HTTP. Gdybyśmy wymienili tylko POST , trasa nie odpowiadałaby już na żądania GET i zwróciłaby błąd 405.

Trasa catch-all

Przydatny może być jeden widok typu catch-all, w którym samodzielnie zajmujesz się złożoną logiką opartą na ścieżce. W tym przykładzie zastosowano dwie reguły: pierwsza reguła konkretnie łapie / a druga reguła łapie dowolne ścieżki za pomocą wbudowanego konwertera path . Konwerter path pasuje do dowolnego łańcucha (łącznie z ukośnikami) Patrz Reguły zmiennych Flask

@app.route('/', defaults={'u_path': ''})
@app.route('/<path:u_path>')
def catch_all(u_path):
    print(repr(u_path))
    ...
c = app.test_client()
c.get('/')  # u_path = ''
c.get('/hello')  # u_path = 'hello'
c.get('/hello/stack/overflow/')  # u_path = 'hello/stack/overflow/'

Metody routingu i HTTP

Domyślnie trasy odpowiadają tylko na żądania GET . Możesz zmienić to zachowanie, podając argument methods do dekoratora route() .

from flask import request

@app.route('/login', methods=['GET', 'POST'])
def login():
    if request.method == 'POST':
        do_the_login()
    else:
        show_the_login_form()

Można również mapować różne funkcje do tego samego punktu końcowego w oparciu o zastosowaną metodę HTTP.

@app.route('/endpoint', methods=['GET'])
def get_endpoint():
    #respond to GET requests for '/endpoint'


@app.route('/endpoint', methods=['POST', 'PUT', 'DELETE'])
def post_or_put():
    #respond to POST, PUT, or DELETE requests for '/endpoint'


Modified text is an extract of the original Stack Overflow Documentation
Licencjonowany na podstawie CC BY-SA 3.0
Nie związany z Stack Overflow