Веб-фреймвок Flask

Введение

Примеры

  • 0

    Основы

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

     # 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) 
  • 0

    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 
  • 0

    Методы 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"] 
  • 1

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

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

  • 0

    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>
    
    

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

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

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

    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") 

Синтаксис

Параметры

Примечания