Szukaj…


Wprowadzenie

Flask jest strukturą mikro sieci Python używaną do prowadzenia głównych stron internetowych, w tym Pintrest, Twilio i Linkedin. W tym temacie wyjaśniono i pokazano różnorodne funkcje oferowane przez Flask do tworzenia stron internetowych zarówno z przodu, jak i z tyłu.

Składnia

  • @ app.route („/ urlpath”, metody = [„GET”, „POST”, „DELETE”, „PUTS”, „HEAD”, „OPTIONS”])
  • @ app.route ("/ urlpath / <param>", metody = [„GET”, „POST”, „DELETE”, „PUTS”, „HEAD”, „OPTIONS”])

Podstawy

Poniższy przykład jest przykładem podstawowego serwera:

# Imports the Flask class
from flask import Flask
# Creates an app and checks if its the main or imported
app = Flask(__name__)

# Specifies what URL triggers hello_world()
@app.route('/')
# The function run on the index route
def hello_world():
    # Returns the text to be displayed
    return "Hello World!"

# If this script isn't an import
if __name__ == "__main__":
    # Run the app until stopped
    app.run()

Uruchomienie tego skryptu (z zainstalowanymi wszystkimi właściwymi zależnościami) powinno uruchomić serwer lokalny. Host to 127.0.0.1 powszechnie znany jako localhost . Ten serwer domyślnie działa na porcie 5000 . Aby uzyskać dostęp do serwera, otwórz przeglądarkę internetową i wprowadź adres URL localhost:5000 lub 127.0.0.1:5000 (bez różnicy). Obecnie tylko twój komputer może uzyskać dostęp do serwera.

app.run() ma trzy parametry: host , port i debugowanie . Host jest domyślnie 127.0.0.1 , ale ustawienie tej wartości na 0.0.0.0 sprawi, że twój serwer będzie dostępny z dowolnego urządzenia w sieci, używając twojego prywatnego adresu IP w adresie URL. port ma domyślnie 5000, ale jeśli parametr jest ustawiony na port 80 , użytkownicy nie będą musieli określać numeru portu, ponieważ przeglądarki domyślnie używają portu 80. Jeśli chodzi o opcję debugowania, podczas procesu programowania (nigdy nie produkcyjnego) pomaga ustawić ten parametr na True, ponieważ serwer uruchomi się ponownie po zmianach wprowadzonych w projekcie Flask.

if __name__ == "__main__":
    app.run(host="0.0.0.0", port=80, debug=True)

Adresy URL routingu

W Flask routing adresów URL odbywa się tradycyjnie przy użyciu dekoratorów. Tych dekoratorów można używać do routingu statycznego, a także do routingu adresów URL z parametrami. W poniższym przykładzie wyobraź sobie, że ten skrypt Flask prowadzi witrynę www.example.com .

@app.route("/")
def index():
    return "You went to www.example.com"

@app.route("/about")
def about():
    return "You went to www.example.com/about"

@app.route("/users/guido-van-rossum")
    return "You went to www.example.com/guido-van-rossum"

W przypadku tej ostatniej trasy możesz zobaczyć, że podając adres URL z opcją / users / i nazwą profilu, możemy zwrócić profil. Ponieważ dołączenie @app.route() dla każdego użytkownika byłoby okropnie nieefektywne i niechlujne, Flask oferuje pobranie parametrów z adresu URL:

@app.route("/users/<username>")
def profile(username):
    return "Welcome to the profile of " + username

cities = ["OMAHA", "MELBOURNE", "NEPAL", "STUTTGART", "LIMA", "CAIRO", "SHANGHAI"]

@app.route("/stores/locations/<city>")
def storefronts(city):
    if city in cities:
        return "Yes! We are located in " + city
    else:
        return "No. We are not located in " + city

Metody HTTP

Dwie najpopularniejsze metody HTTP to GET i POST . Flask może uruchamiać inny kod z tego samego adresu URL w zależności od użytej metody HTTP. Na przykład w usłudze internetowej z kontami najwygodniej jest kierować stronę logowania i proces logowania przez ten sam adres URL. Żądanie GET, takie samo, jak w przypadku otwarcia adresu URL w przeglądarce, powinno zawierać formularz logowania, natomiast żądanie POST (zawierające dane logowania) powinno być przetwarzane osobno. Trasa jest również tworzona w celu obsługi metody DELETE i PUT HTTP.

@app.route("/login", methods=["GET"])
def login_form():
    return "This is the login form"
@app.route("/login", methods=["POST"])
def login_auth():
    return "Processing your data"
@app.route("/login", methods=["DELETE", "PUT"])
def deny():
    return "This method is not allowed"

Aby nieco uprościć kod, możemy zaimportować pakiet request z kolby.

from flask import request

@app.route("/login", methods=["GET", "POST", "DELETE", "PUT"])
def login():
    if request.method == "DELETE" or request.method == "PUT":
        return "This method is not allowed"
    elif request.method == "GET":
        return "This is the login forum"
    elif request.method == "POST":
        return "Processing your data"

Aby pobrać dane z żądania POST, musimy użyć pakietu request :

from flask import request
@app.route("/login", methods=["GET", "POST", "DELETE", "PUT"])
def login():
    if request.method == "DELETE" or request.method == "PUT":
        return "This method is not allowed"
    elif request.method == "GET":
        return "This is the login forum"
    elif request.method == "POST":
        return "Username was " + request.form["username"] + " and password was " + request.form["password"]

Pliki i szablony

Zamiast wpisywać nasz znacznik HTML w instrukcjach return, możemy użyć funkcji render_template() :

from flask import Flask
from flask import render_template
app = Flask(__name__)

@app.route("/about")
def about():
    return render_template("about-us.html")

if __name__ == "__main__":
    app.run(host="0.0.0.0", port=80, debug=True)

Spowoduje to użycie naszego pliku szablonu about-us.html . Aby nasza aplikacja mogła znaleźć ten plik, musimy zorganizować nasz katalog w następującym formacie:

- application.py
/templates
    - about-us.html
    - login-form.html
/static
    /styles
        - about-style.css
        - login-style.css
    /scripts
        - about-script.js
        - login-script.js

Co najważniejsze, odwołania do tych plików w kodzie HTML muszą wyglądać następująco:

<link rel="stylesheet" type="text/css", href="{{url_for('static', filename='styles/about-style.css')}}">

co spowoduje, że aplikacja wyszuka about-style.css w folderze styles w folderze statycznym. Ten sam format ścieżki dotyczy wszystkich odniesień do obrazów, stylów, skryptów lub plików.

Jinja Templating

Podobnie jak Meteor.js, Flask dobrze integruje się z usługami szablonów front-end. Flask używa domyślnie szablonów Jinja. Szablony pozwalają na użycie małych fragmentów kodu w pliku HTML, takich jak warunkowe lub pętle.

Kiedy renderujemy szablon, wszelkie parametry poza nazwą pliku szablonu są przekazywane do usługi szablonów HTML. Następująca trasa przekaże nazwę użytkownika i datę dołączenia (z funkcji gdzie indziej) do kodu HTML.

@app.route("/users/<username>)
def profile(username):
    joinedDate = get_joined_date(username) # This function's code is irrelevant
    awards = get_awards(username) # This function's code is irrelevant
    # The joinDate is a string and awards is an array of strings
    return render_template("profile.html", username=username, joinDate=joinDate, awards=awards)

Kiedy ten szablon jest renderowany, może używać zmiennych przekazywanych do niego z funkcji render_template() . Oto zawartość profile.html :

<!DOCTYPE html>
<html>
    <head>
        # if username
            <title>Profile of {{ username }}</title>
        # else
            <title>No User Found</title>
        # endif
    <head>
    <body>
        {% if username %}
            <h1>{{ username }} joined on the date {{ date }}</h1>
            {% if len(awards) > 0 %}
                <h3>{{ username }} has the following awards:</h3>
                <ul>
                {% for award in awards %}
                    <li>{{award}}</li>
                {% endfor %}
                </ul>
            {% else %}
                <h3>{{ username }} has no awards</h3>
            {% endif %}
        {% else %}
            <h1>No user was found under that username</h1>
        {% endif %}
        {# This is a comment and doesn't affect the output #}
    </body>
</html>

Do różnych interpretacji używane są następujące ograniczniki:

  • {% ... %} oznacza instrukcję
  • {{ ... }} oznacza wyrażenie, w którym wyprowadzany jest szablon
  • {# ... #} oznacza komentarz (nieuwzględniony w szablonie wyjściowym)
  • {# ... ## oznacza, że resztę linii należy interpretować jako instrukcję

Obiekt żądania

Obiekt request zawiera informacje o żądaniu złożonym na trasie. Aby wykorzystać ten obiekt, należy go zaimportować z modułu kolby:

from flask import request

Parametry URL

W poprzednich przykładach użyto request.method i request.form , jednak możemy również użyć właściwości request.args aby pobrać słownik kluczy / wartości w parametrach URL.

@app.route("/api/users/<username>")
def user_api(username):
    try:
        token = request.args.get("key")
        if key == "pA55w0Rd":
            if isUser(username): # The code of this method is irrelevant
                joined = joinDate(username) # The code of this method is irrelevant
                return "User " + username + " joined on " + joined
            else:
                return "User not found"
        else:
            return "Incorrect key"
    # If there is no key parameter
    except KeyError:
        return "No key provided"

Aby poprawnie uwierzytelnić się w tym kontekście, potrzebny będzie następujący adres URL (zastąpienie nazwy użytkownika dowolną nazwą użytkownika:

www.example.com/api/users/guido-van-rossum?key=pa55w0Rd

Przesyłanie plików

Jeśli przesłanie pliku było częścią przesłanego formularza w żądaniu POST, pliki można przetwarzać za pomocą obiektu request :

@app.route("/upload", methods=["POST"])
def upload_file():
    f = request.files["wordlist-upload"]
    f.save("/var/www/uploads/" + f.filename) # Store with the original filename

Ciasteczka

Żądanie może również zawierać pliki cookie w słowniku podobnym do parametrów adresu URL.

@app.route("/home")
def home():
    try:
        username = request.cookies.get("username")
        return "Your stored username is " + username
    except KeyError:
        return "No username cookies was found")


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