Введение

Примеры

Основы

В следующем примере приведен пример базового сервера:

 # 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 обычно известная как локальные. Этот сервер по умолчанию работает на порт 5000. Чтобы получить доступ к веб - сервер, откройте веб - браузер и введите URL - localhost:5000 или 127.0.0.1:5000 (без разницы). В настоящее время только ваш компьютер может получить доступ к веб-серверу.

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

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

URL-адреса маршрутизации

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

 @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 - разметку в отчетности возвращения, мы можем использовать 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") 

Синтаксис

Параметры

Примечания