Поиск…


Вступление

Flask - это веб-инфраструктура Python, используемая для управления основными веб-сайтами, включая Pintrest, Twilio и Linkedin. В этом разделе объясняется и демонстрируется разнообразие функций Flask для разработки веб-сайтов как на передней, так и на задней панели.

Синтаксис

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

Основы

Следующий пример - пример базового сервера:

# 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()

Запуск этого сценария (при всех установленных зависимостях) должен запустить локальный сервер. Хост - 127.0.0.1 обычно известный как localhost . Этот сервер по умолчанию работает на порту 5000 . Чтобы получить доступ к веб-серверу, откройте веб-браузер и введите URL-адрес localhost:5000 или 127.0.0.1:5000 (без разницы). В настоящее время только ваш компьютер может получить доступ к веб-серверу.

app.run() имеет три параметра: хост , порт и отладка . Хост по умолчанию 127.0.0.1 , но установка этого 0.0.0.0 сделает ваш веб-сервер доступным с любого устройства в вашей сети, используя ваш частный IP-адрес в URL-адресе. порт по умолчанию 5000, но если параметр установлен на порт 80 , пользователям не нужно указывать номер порта, так как браузер использует порт 80 по умолчанию. Что касается опции отладки, то в процессе разработки (никогда в производстве) это помогает установить этот параметр в значение «Истина», так как ваш сервер будет перезагружен при внесении изменений в проект Flask.

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

Маршрутизация URL-адресов

С Flask маршрутизация URL-адресов традиционно выполняется с помощью декораторов. Эти декораторы могут использоваться для статической маршрутизации, а также для маршрутизации URL-адресов с параметрами. В следующем примере представьте, что этот сценарий Flask работает на веб-сайте 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"

С помощью этого последнего маршрута вы можете видеть, что с учетом URL-адреса с / users / и именем профиля мы можем вернуть профиль. Поскольку было бы ужасно неэффективно и беспорядочно включать @app.route() для каждого пользователя, Flask предлагает взять параметры из 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

Методы HTTP

Двумя наиболее распространенными методами HTTP являются GET и POST . Флажок может запускать другой код с одного и того же URL-адреса в зависимости от используемого метода HTTP. Например, в веб-службе с учетными записями наиболее удобно маршрутизировать страницу входа и вход в систему с помощью одного и того же URL-адреса. Запрос GET, то же самое, что и при открытии URL-адреса в вашем браузере, должен содержать форму входа в систему, а запрос POST (с регистрационными данными) должен обрабатываться отдельно. Маршрут также создается для обработки метода DELETE и 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"

Чтобы немного упростить код, мы можем импортировать пакет 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 "Processing your data"

Чтобы получить данные из запроса POST, мы должны использовать пакет 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"]

Файлы и шаблоны

Вместо того, чтобы вводить нашу разметку HTML в операторы return, мы можем использовать 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)

Это будет использовать наш файл шаблона about-us.html . Чтобы наше приложение могло найти этот файл, мы должны организовать наш каталог в следующем формате:

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

Самое главное, ссылки на эти файлы в HTML должны выглядеть так:

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

который направит приложение искать about-style.css в папке стилей под статической папкой. Тот же формат пути применяется ко всем ссылкам на изображения, стили, сценарии или файлы.

Jinja Templating

Подобно Meteor.js, Flask хорошо сочетается с услугами по настройке интерфейсов. Flask использует по умолчанию Jinja Templating. Шаблоны позволяют использовать небольшие фрагменты кода в файле HTML, такие как условные обозначения или циклы.

Когда мы создаем шаблон, любые параметры за пределами имени файла шаблона передаются в службу шаблонов HTML. Следующий маршрут будет передавать имя пользователя и дату присоединения (от функции в другом месте) в 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)

Когда этот шаблон визуализируется, он может использовать переменные, переданные ему из функции render_template() . Вот содержимое 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>

Для разных интерпретаций используются следующие разделители:

  • {% ... %} обозначает оператор
  • {{ ... }} обозначает выражение, в котором выводится шаблон
  • {# ... #} обозначает комментарий (не входит в вывод шаблона)
  • {# ... ## подразумевает, что остальная часть строки должна интерпретироваться как оператор

Объект запроса

Объект request предоставляет информацию о запросе, который был отправлен на маршрут. Чтобы использовать этот объект, он должен быть импортирован из модуля фляжки:

from flask import request

Параметры URL

В предыдущих примерах использовались request.method и request.form , однако мы также можем использовать свойство request.args для получения словаря ключей / значений в параметрах 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"

Чтобы правильно аутентифицироваться в этом контексте, понадобится следующий URL (заменив имя пользователя любым именем пользователя:

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

Загрузка файлов

Если загрузка файла была частью представленной формы в запросе POST, файлы можно обрабатывать с использованием объекта 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

Печенье

Запрос также может включать файлы cookie в словаре, аналогичном параметрам 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
Лицензировано согласно CC BY-SA 3.0
Не связан с Stack Overflow