Python Language
колба
Поиск…
Вступление
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")