Введение
Примеры
Основы
В следующем примере приведен пример базового сервера:
# 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")