Кратко
В предыдущем разделе мы написали скрипт сканера для сканирования новостей и регулярно собирали новости в 8:00 каждое утро и сохраняли их в База данных MySQL. Подключитесь к базе данных напрямую с помощью DataGrip, и вы сможете просматривать просканированные новости. но, Не окончательная форма, которую мы хотим. Я бы хотел, чтобы показ новостей можно было делать прямо на телефоне, а не Каждый раз, когда мне приходится включать компьютер, открывать темные страницы DataGrip, фильтровать, копировать и вставлять. Прежде чем писать это приложение, Чтобы сначала узнать что-то о сети, напишите несколько интерфейсов. Есть еще два популярных Flask и Django в Python, автор выбирает Относительно легкая версия Flask. письмо«Как использовать Python, чтобы спекулировать и разбогатеть на несколько дней», некоторые студенты написали мне в личных сообщениях Для Flask нет рекомендаций по обучению. Просто зайдите во Flask в этот раздел, а затем используйте Flask для написания интерфейса API и Статические страницы и напрямую генерируют стиль официального аккаунта. Контента много и он относительно скучный, рекомендуется сначала собрать его и смотреть не спеша~
1. Введение в Flask
Облегченная среда веб-приложений с микроядром, основанная на пакете WSGI Werkzeug и механизме шаблонов Jinja2. Ядро компактно, легко расширяется и требует меньших затрат на обучение, то есть можно разработать простой веб-сайт.
Связанная документация:
- Официальный сайт фляги:flask.pocoo.org/
- Репозиторий Flask Github:GitHub.com/pallets/Фала…
- Официальная документация фляги:flask.pocoo.org/docs/1.0
- Официальная документация фляги(Китайская версия):dormousehole.readthedocs.io/en/latest/
- Учебные ресурсы Flask:GitHub.com/Хумиао/…
2. Создание среды разработки Flask
Вы можете установить его напрямую с помощью команды pip:
pip install flask
Обратите внимание здесь "Установить глобально"и"установка виртуальной среды«Разница в том, что многие читатели уже задавали этот вопрос:
Я уже выполнил библиотеку pip install xxx в командной строке, но когда я ввожу pycharm, он все еще предлагает, что модуль не может быть найден?
Для этого есть два альтернативных решения:
- Вариант первый:Выполните команду установки pip на терминале в PyCharm.(Примечание: перед ним находится venv)
- Вариант 2:Проверить наследование глобальных stie-пакетов
Лично я предпочитаю первый.Чтобы решить проблему поддержки разных проектов, соответствующих разным версиям, Python использует концепцию виртуальной среды. Установка сторонних пакетов в виртуальной среде повлияет только на виртуальную среду и не повлияет на глобальный интерпретатор Python. В Python3, Виртуальная среда стала встроенным модулем, пример создания файла с виртуальной средой следующий:
mkdir Test
cd Test
python -m venv venv
После выполнения вышеуказанной команды Python запустит пакет venv и создаст виртуальную среду venv.Вышеуказанные два параметра venv:
- Имя пакета виртуальной среды Python, исправлена запись venv
- Имя, применяемое к этой конкретной виртуальной среде., вы можете изменить его на имя, которое вам нравится, но автор привык называть его venv, переключитесь на другое При создании проекта можно быстро найти соответствующую виртуальную среду.
После того, как виртуальная среда создана, ее необходимо активировать для входа с помощью следующей команды «Активировать виртуальную среду":
source venv/bin/activate
После выполнения вы увидите, что префикс терминала имеет дополнительный venv.После активации виртуальной среды конфигурация среды терминального сеанса будет изменена. На этом этапе ввод Python или pip фактически вызовет интерпретатор Python в виртуальной среде. Сценарий приложения:Откройте несколько терминалов для отладки нескольких приложений, и каждое окно терминала может активировать разные виртуальные среды, не мешая друг другу.
Примечание. Если вы используете систему Python2 или Windows, если вы хотите использовать виртуальную среду, вы должны сначала передать команду pip Установка Сначала установите волну virtualenvwrapper:pip install virtualenvwrapper. Затем создайте виртуальную среду:virtualenv venvи, наконец, активируйте виртуальную среду:venv\Scripts\activate.bat.
3. Самый простой Hello Flask
Создайте новый скрипт hello.py со следующим содержимым:
# coding=utf-8
from flask import Flask
app = Flask(__name__)
@app.route("/")
def hello():
return "Hello Flask!"
if __name__ == "__main__":
app.run()
Запустите скрипт, введя в терминале следующую команду:
python hello.py
После запуска вы можете увидеть вывод следующим образом:
Браузер открывается:http://127.0.0.1:5000, вы можете увидеть Hello Flask!
После того, как служба запустится, она войдет в опрос, подождет и обработает запрос, пока программа не будет завершена, вы также можете напрямую нажать Ctrl+C, чтобы остановить ее. Затем разберите волну кода построчно:
- линия 1: используется для объявления синтаксиса кодирования исходного файла Python, эта информация будет использоваться синтаксическим анализатором Python для последующего анализа исходного файла, Как правило, utf-8 используется единообразно.
- строка 2: познакомить с классом Flask.
-
строка 4: создание экземпляра приложения класса Flask, которое получает имя пакета или модуля в качестве параметра, обычно передаваемого напрямую в
__name__
, позволятьflask.helpers.get_root_pathФункция определяет корневой каталог программы, передавая это имя для получения статических файлов и Каталог для файлов шаблонов. - Строки 6-8:app:Route Decorator будетСвязь между URL и выполняемой функцией просмотраСохранить вapp.url_mapхарактеристики. Эти три строки просто: когда браузер получает доступ к корневому адресу ("/") серверной программы, экземпляр Flask выполняет функцию просмотра hello(), Затем вернитесь: Привет, Фласк!
- строка 10: Когда другие файлы ссылаются на этот файл, код в этом решении не будет выполняться.
- строка 11: Запустите службу.По умолчанию Flask прослушивает только локальный адрес 127.0.0.1 и порт 5000. Если вы хотите изменить порт, вы можете Входящие параметры»порт=номер порта", если вы хотите поддерживать удаленный доступ, введите "host="0.0.0.0"", вы также можете установить Режим отладки, просто передайте параметр "debug=True", когда включен режим отладки, сервер автоматически перезапустится после изменения кода. Загрузите и предоставьте страницу отладки, которая может получить контекст ошибки и исполняемый код при возникновении ошибки.
4. модуль flask-скрипта
Роль этого модуля заключается в управлении Flask через командную строку и использовании командной строки для передачи параметров, а не только через app.run() для передачи. Этот модуль можно установить напрямую с помощью команды pip:
pip install flask-script
Создайте новый файл manage.py:
from flask_script import Manager
from flask import Flask
app = Flask(__name__)
manager = Manager(app)
if __name__ == '__main__':
manager.run()
Затем в командной строке введите:
python manage.py runserver -h ip -p 端口
Другие параметры включают в себя:-d(включить режим отладки),-r(автоматически загружается после модификации кода),--help(см. справочную информацию).
5. Маршрутизация и представления
Вышеупомянутый:
@app.route("/")
def hello():
return "Hello Flask!"
Определяет отношение сопоставления между URL-адресами и функциями Python, которое называется маршрутизацией.
динамическая маршрутизация 0x1
Иногда могут быть некоторые URL-адреса с одинаковыми правилами, например:
app.route("/login")
app.route("/register")
Мы можем абстрагировать такие URL-адреса в шаблон URL-адреса, например:
@app.route('/<do>')
def hello(do):
return "<h1>当前请求:%s </h1>" % do
Flask поддерживает эту динамическую форму маршрутизации.Динамическая часть по умолчанию представляет собой строку.Вы также можете указать тип параметра.
Например, принимаются только целые числа:
тег поля | описывать | Пример |
---|---|---|
string | По умолчанию принимает любой текст без косой черты "/" | <string:name> |
int | целое число | <in:id> |
float | число с плавающей запятой | <float:price> |
path | Как строка, но также принимает косые черты | <path:address> |
uuid | принимает только строки uuid | <string:uuid> |
any | Можно указать несколько путей, но параметры должны быть переданы в | <any(int,string):params> |
Еще одно замечание:Уникальный URL, например, следующее представляет два разных URL-адреса:
CodingBoy.io/article/
CodingBoy.io/article
Создание URL-адреса 0x2
В Flask вы можете использовать функцию url_for() для создания URL-адреса, принимая имя функции представления в качестве первого параметра, Также принимает именованные параметры, соответствующие переменной части правила URL, а неизвестная переменная часть будет добавлена в конец URL в качестве запроса. параметр. Здесь следует отметить одну вещь:Операция — это функция, а не путь в маршруте! ! ! !Построение с помощью функций, а не непосредственное объединение строк, в основном используется для следующих двух целей:
- Когда вам нужно будет изменить его в будущем, вам нужно изменить URL-адрес только один раз, вместо того, чтобы заменять его везде;
- При построении URL-адреса специальные символы и данные Unicode автоматически экранируются без необходимости заниматься этим самостоятельно;
Пример использования следующий:
with app.test_request_context():
print(url_for('hello', uid=1))
print(url_for('hello', uid=2, kind='测试'))
Вывод выглядит следующим образом:
/?uid=1
/?uid=2&kind=%E6%B5%8B%E8%AF%95
Если вы хотите сгенерировать абсолютный путь, вы можете добавить "_external=True"параметр.
Примечание: test_request_context может генерировать контекст запроса в интерактивном режиме без app.run(). Для запуска этого проекта прямое выполнение также будет иметь контекст Falsk.
0x3 Ограничение метода запроса
HTTP поддерживает различные методы запросов. По умолчанию маршрут отвечает только на GET-запросы. Если не верите, можете использовать его самостоятельно. PostMan инициирует POST-запрос к интерфейсу, и результат показан на рисунке:
Код ответа — 405, указывающий, что этому методу запроса не разрешено запрашивать этот URL-адрес. Установите параметр методов в декораторе app.route для изменения. Пример измененного кода выглядит следующим образом:
@app.route("/", methods=['GET', 'POST'])
def hello():
return "Hello Flask!"
Разумеется, поддерживаются и другие методы запроса: PUT, HEAD, DELETE, OPTIONS, PATCH.Если вы хотите поддерживать несколько методов, вы можете разделить их запятыми.
6. Шаблон
В веб-разработке мы часто используем шаблонизаторы Что такое шаблон? файл, содержащий текст ответа, использоватьЗаполнитель(переменная) идентифицирует динамический раздел, сообщая обработчику шаблонов, что егоКонкретное значение должно быть получено из используемых данных.
0x1 Связь между представлением и шаблоном
В предыдущем примере основная функция функции представления — генерировать ответ на запрос, но в реальной разработке функция представления имеет Две функции: "обрабатывать бизнес-логику"и"вернуть содержимое ответа". В крупных проектах, если бизнес-логика Объединение его с содержимым презентации увеличит сложность кода и стоимость обслуживания. Роль шаблона заключается в следующем: "Возьмите на себя ответственность за часть содержимого ответа, возвращаемого функцией представления, чтобы структура кода была ясной, а связь была низкой." Подстановка переменных реальными значениями и затем (управление) возвратом результирующей строки называется "оказывать". По умолчанию в Flask "Jinja2"Этот шаблонизатор для рендеринга шаблона.
Синтаксис 0x2 Jinja2
В качестве простого примера введения шаблонов, ниже приведена простая программа без использования шаблонов:
# coding=utf-8
from flask import Flask
app = Flask(__name__)
@app.route("/<user>")
def hello(user):
if user == 'admin':
return "<h1>管理员,您好!<h1>"
else:
return "<h1>%s, 您好!</h1>" % user
if __name__ == "__main__":
app.run()
Затем мы используем шаблон Jinja2 для перезаписи, по умолчанию Flask будет в «Подпапка templates проекта" Ищем шаблоны в, создаем папку templates, а затем создаем новый index.html, содержимое такое:
"<h1>{{name}},您好!<h1>"
Затем измените файл hello.py, измененное содержимое выглядит следующим образом:
from flask import Flask, render_template
app = Flask(__name__)
@app.route("/<user>")
def hello(user):
if user == 'admin':
return render_template("index.html", user="管理员")
else:
return render_template("index.html", user=user)
if __name__ == "__main__":
app.run()
Затем запустите hello.py, введите следующий адрес в браузере, соответствующий вывод будет следующим:
http://127.0.0.1:5000/admin # 输出结果:管理员,您好!
http://127.0.0.1:5000/jay # 输出结果:jay,您好!
Выше приведен простой пример использования шаблона, предоставленный вызовом Flaskrender_templateфункция, Генерируется шаблон, первый параметр — имя шаблона, а последующие параметры — пары ключ-значение, указывающие на то, что шаблон Истинное значение, соответствующее переменной. Затем подробно объясните синтаксис волны Jinja2:
- 1.Переменная
Jinja2 использует**{{变量名}}
** для представления переменной помимо основных типов данных также можно использовать списки, поля
Или сложные типы, такие как объекты, примеры следующие:
<h1> 账号:{{ user['name'] }},密码:{{ user['passwd'] }}
- 2.структура управления
Jinja2 предоставляет различные структуры управления, такие как общие суждения и структуры циклов, для изменения процесса рендеринга шаблонов. Также закладываем в шаблон логику вышеуказанного суждения, пример такой:
{# 注释,不会输出到浏览器中 #}
{% if user == 'admin' or user == '管理员' %}
<h1> 管理员,您好! </h1>
{% else %}
<h1> {{ user }},您好!</h1>
{% endif %}
{# 循环打印 #}
{% for num in num_list %}
<h2>{{ num }}</h2>
{% endfor %}
Затем измените файл hello.py:
@app.route("/<user>")
def hello(user):
return render_template("index.html", user=user, num_list=[1, 2, 3])
Введите разные URL-адреса, и соответствующие результаты вывода браузера будут следующими:
http://127.0.0.1:5000/admin
管理员,您好!
1
2
3
http://127.0.0.1:5000/jay
jay,您好!
1
2
3
- 3.макрос
В Python, если есть очень часто используемый код, мы обычно извлекаем его в функцию. Это можно сделать с помощью макросов. Синтаксис следующий:
# 创建宏
{% macro 标签名(key=value) %}
常用代码
{% end macro %}
# 调用宏
{{ 标签名(key=value) }}
Если макросов много, их можно извлечь в отдельный HTML и импортировать.
{% import 'xxx.html' as 别名 %}
{{ 别名.标签名(key=value) }}
- 4.наследование шаблонов
Еще один способ повторного использования кода: наследование шаблонов, как и наследование классов в Python, требует базового шаблона, используя{% block XXX %}{% endblock %}
Идентифицирует блок кода, который может быть перегружен в подмодулях.
Пример кода выглядит следующим образом:
# 基模板:base.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
{% block head %}
<title>{% block title %} Title {% endblock %} </title>
{% endblock %}
</head>
<body>
{% block body %}
{% endblock %}
</body>
</html>
# 子模板:son.html
{% extends "base.html" %}
{% block title %}Son{% endblock %}
{% block head %}
{{ super() }}
{% endblock %}
{% block body %}
<h1>Hello Flask!</h1>
{% endblock %}
Краткое описание кода:
В первой строке кода используется команда extends, указывающая, что шаблон наследуется от base.html, а затем переписываются заголовок, заголовок и Блок кода тела, функция super() выше, используется для получения исходного содержимого базового шаблона.
- 5.inclue
Вы можете использовать оператор включения для включения шаблона, и включенный шаблон будет добавлен в соответствующую позицию оператора включения во время рендеринга. Пример использования следующий:
{% include 'header.html' %}
Вы также можете использовать "ignore missing", если шаблон не существует, Jinja2 проигнорирует это утверждение, пример следующий:
{% include 'header.html' ignore missing %}
- 6.назначать
Вы можете использовать тег set для присвоения значений, например:
{% set a,b = 1,2}
<h1>{{ a }}{{ b }}</h1>
- 7.Встроенный фильтр
Суть фильтра — это функция, которую иногда нужно изменить, отформатировать или вычислить между переменными, что невозможно в шаблонах. Фильтры можно использовать для прямого вызова некоторых методов в Python. Шаблонные фильтры поддерживают цепочку:
{{ "hello flask" | reverse | upper}},
Эта строка кода инвертирована + преобразована в верхний регистр. Общие встроенные фильтры включают строки и списки.Фильтры манипулирования строкамиКак показано в таблице ниже:
фильтр | описывать |
---|---|
safe | Отключить экранирование |
capitalize | Преобразовать первую букву значения переменной в верхний регистр, а остальные — в нижний. |
lower | преобразовать значение в нижний регистр |
upper | преобразовать значение в верхний регистр |
title | Преобразование первой буквы каждого слова в значении в верхний регистр |
reverse | Реверс строки |
format | форматированный вывод |
striptags | Удалите все теги HTML из значения перед рендерингом |
truncate | Усечение строки |
Получение списка фильтров действийКак показано в таблице ниже:
фильтр | описывать |
---|---|
first | взять первый элемент |
last | взять последний элемент |
length | получить длину списка |
sum | суммирование списка |
sort | Сортировать список |
- 8.пользовательский фильтр
Пишите прямо в файл py, пример кода такой:
# 1.定义过滤器
def do_listreverse(li):
temp_li = list(li)
temp_li.reverse()
return temp_li
# 2.添加自定义过滤器
app.add_template_filter(do_listreverse, 'listreverse')
Суммировать:
Макросы, наследование и включение используются для реализации повторного использования кода Функции макросов аналогичны функциям, которые могут передавать параметры и должны быть определены и вызваны; Суть наследования в том.замена кода, который обычно используется для реализации повторяющихся и неизменных областей на нескольких страницах, а include — для непосредственного Целевой файл шаблона визуализируется полностью.
7. Запрос и ответ
Во Flask HTTP-запросы инкапсулируются в объекты Request, а HTTP-ответы инкапсулируются в объекты Response. Следовательно, логическая обработка разработки приложений Flask основана на этих двух объектах.
0x1 Запрос
Flask инкапсулирует данные HTTP-запроса, пересылаемые сервером WSGI, в объект запроса, который содержит запрошенный Для получения соответствующей информации вы можете получить соответствующую информацию через свойства в следующей таблице.
Атрибуты | описывать | тип данных |
---|---|---|
form | Запишите данные формы в запрос. | MultiDict |
args | Запишите параметры запроса в запросе. | MultiDict |
cookies | Регистрировать файлы cookie в запросах. | Dict |
headers | Запишите заголовки в запросе. | EnvironHeaders |
method | Регистрирует метод HTTP, используемый запросом. | string |
environ | Запишите переменные среды, перенаправленные сервером WSGI. | Dict |
url | Запишите URL-адрес запроса. | string |
- 1.Чтение параметров запроса запроса
Данные формы, представленные браузером в форме запроса Get, Flask будут хранить его в экземпляре запросаargs, вы также можете использоватьvaluesАтрибуты Чтобы запросить, прочтите пример кода следующим образом:
# coding=utf-8
from flask import Flask, request, json
app = Flask(__name__)
@app.route("/index")
def index():
return '''
<form method="GET" action="/login">
<input type="text" placeholder="账号" name="user"> <br />
<input type="text" placeholder="密码" name="pawd"> <br />
<input type="submit" value="登录">
</form>
'''
@app.route("/login")
def login():
msg = ""
if 'user' in request.args:
msg += request.args['user'] + ':'
msg += request.values.get('pawd','')
return msg
if __name__ == "__main__":
app.run(debug=True)
После запуска кода откройте:http://127.0.0.1:5000/index, браузер:
После ввода пароля учетной записи перейдите к:http://127.0.0.1:5000/login?user=Portfolio&Fraid of Me=123,Браузер:
- 2.Чтение данных формы запроса
Данные формы, отправленные браузером в виде запроса GET, Flask сохранит их в виде экземпляра запроса, вы можете использовать оператор [] Прочитать указанное значение ключа. Пример чтения кода выглядит следующим образом:
# coding=utf-8
from flask import Flask, request, json
app = Flask(__name__)
@app.route("/index")
def index():
return '''
<form method="POST" action="/login">
<input type="text" placeholder="账号" name="user"> <br />
<input type="text" placeholder="密码" name="pawd"> <br />
<input type="submit" value="登录">
</form>
'''
@app.route("/login", methods=['POST'])
def login():
msg = ""
msg += request.form['user'] + ':'
msg += request.form['pawd']
return msg
if __name__ == "__main__":
app.run(debug=True)
После запуска кода откройте:http://127.0.0.1:5000/index, браузер:
После ввода пароля учетной записи перейдите к:http://127.0.0.1:5000/логин, браузер:
0x2 Ответный ответ
Соответствуя запросу, ответ используется для отправки информации об ответе в браузер в соответствии с результатом, возвращаемым функцией просмотра. эта функция просмотра Это функция, которую мы маршрутизируем ниже. Возвращаемое значение функции представления будет автоматически преобразовано в объект ответа. Логика преобразования выглядит следующим образом:
- 1. Возвращаемое значениедопустимый объект ответа, вернуться прямо из представления;
- 2. Возвращаемое значениенить, создаст строку со строкой и параметрами по умолчанию в качестве тела, код возврата — 200, а тип MIME — Объект ответа Werkzeug.wrappers.Response для текста/html.
- 3. Возвращаемое значениекортеж, где элементы могут предоставлять дополнительную информацию, но формат должен быть (ответ, статус, заголовки) В виде хотя бы одного элемента значение состояния переопределит код состояния, а заголовки могут быть словарем или списком в качестве дополнительных заголовков сообщений.
- 4. Еслини один, Flask будет считать, что возвращаемое значение является допустимой программой WSGI через Response.force(rv.request.environ) Преобразован в объект запроса. В дополнение к возврату по return вы также можете явно вызвать функцию make_response для возврата.Преимущество в том, что вы можете Задайте дополнительную информацию, например:
def hello():
resp = make_response("Hello Flask!", 250)
return resp
Кроме того, текущий интерфейс API возвращает формат JSON, вы можете использоватьjsonifyПод упаковкой модифицированный пример кода выглядит следующим образом:
# coding=utf-8
from flask import Flask, make_response, jsonify
from werkzeug.wrappers import Response
app = Flask(__name__)
@app.route("/", methods=['GET', 'POST'])
def hello():
resp = make_response({'code': '200', 'msg': '请求成功', 'data': [{'data_1': ['数据', '数据'], 'data_2': ['数据', '数据']}]})
return resp
class JsonResponse(Response):
@classmethod
def force_type(cls, response, environ=None):
if isinstance(response, dict):
response = jsonify(response)
return super(JsonResponse, cls).force_type(response, environ)
app.response_class = JsonResponse
if __name__ == "__main__":
app.run(debug=True)
Вывод интерфейса запроса выглядит следующим образом:
{
"code": "200",
"data": [
{
"data_1": [
"数据",
"数据"
],
"data_2": [
"数据",
"数据"
]
}
],
"msg": "请求成功"
}
Вы также можете использовать функцию dumps() модуля json Flask для преобразования объекта массива или словаря в строку JSON Пример кода выглядит следующим образом:
data = {'code': '200', 'msg': '请求成功', 'data': [{'data_1': ['数据', '数据'], 'data_2': ['数据', '数据']}]}
return json.dumps(data),200,[('Content-Type','application/json;charset=utf-8')]
- 3.установить кукиФункция set_cookie() предоставляется в классе Response для установки файла cookie клиента. Если мы хотим установить файл cookie, нам нужно создать экземпляр Response самостоятельно. (через make_response), необязательные параметры:
set_cookie(
key, //键
value='', //值
max_age=None, //秒为单位的cookie寿命,None表示http-only
expires=None, //失效时间,datetime对象或unix时间戳
path='/', //cookie的有效路径
domain=None, //cookie的有效域
secure=None,
httponly=False)
8. Перенаправления и сеансы
Веб-разработке часто приходится иметь дело с перенаправлениями и сессиями.redirect"и"session"для их обработки.
0x1 редирект
Перенаправление страниц очень распространено. Наиболее распространенным является оценка статуса входа в систему. Если вы не вошли в систему, чтобы перенаправить веб-страницу на страницу входа, вы можете использовать перенаправление в Flask. Объект обрабатывает его.Код состояния по умолчанию — 302, который можно изменить, передав параметр кода, как правило: 301, 302, 303, 305 и 307, Простой пример кода выглядит следующим образом:
# coding=utf-8
from flask import Flask, redirect
app = Flask(__name__)
user_name = ''
@app.route('/article')
def article():
if user_name == '':
# 如果用户名为空,重定向跳转到登录页
return redirect('/login')
else:
return "文章页"
@app.route("/login")
def login():
global user_name
user_name = 'admin'
return "登录成功!"
if __name__ == "__main__":
app.run(debug=True)
Процесс работы после запуска выглядит следующим образом:
浏览器键入:http://127.0.0.1:5000/article
自动跳转到:http://127.0.0.1:5000/login,显示登录成功
再次访问:http://127.0.0.1:5000/article,显示文章页
сеанс 0x2
Мы можем хранить данные в сеансе пользователя (сеансе), который является приватным хранилищем, которое по умолчанию сохраняется в файле cookie на стороне клиента. Сессии в основном предназначены для решения двух задач:Идентификация посетителей и информационные записи о посетителях". Когда браузер обращается к серверу в первый раз, сервер В файле cookie задается уникальный идентификатор сеанса, который автоматически включается в заголовок браузера при последующем доступе к серверу.Сервер использует этот идентификатор для Различайте разных посетителей. Сеанс зависит от файлов cookie, которые обычно хранятся на сервере.Flask предоставляет объекты сеанса для управления сеансами пользователей. Вы можете использовать оператор [] для чтения или установки указанного значения ключа.По умолчанию Flask шифрует объект сеанса и сохраняет его в файле cookie клиента. Поэтому зашифрованное начальное число должно быть настроено с помощью атрибута secret_key экземпляра приложения для использования сеанса. Примеры использования следующие:
# 设置session
session['name'] = 'jay'
# 读取session
session.get('name')
# 配置加密种子(两种方法二选一)
app.secret_key = '123456'
app.config['SECRET_KEY']='123456'
9. Управление статическими файлами
Статические файлы — это те файлы, которые не изменяются, например изображения, файлы стилей CSS, файлы сценариев JavaScript и файлы шрифтов. По умолчанию Flask будет искать статические файлы в подкаталоге с именем static в корневом каталоге, поэтому, если вам нужно использовать статические файлы, вы можете создать static, а затем поместите в нее статические файлы. Вы можете обратиться к следующей структуре для организации вашего проекта:
static/
css/
lib/
bootstrap.css
style.css
home.css
js/
lib/
jquery.js
chart.js
home.js
img/
logo.svg
favicon.ico
Кроме того, не пишите статический путь к файлу в шаблоне, для генерации пути следует использовать функцию url_for, пример такой:
url_for('static', filename='css/style.css')
Конечно, если вы хотите изменить реальный каталог статических файлов, вы можете передать параметры в конструкторе Flask:static_folder= 'имя папки'. Кроме того, для получения большей вычислительной мощности рекомендуется использовать Nginx или другие веб-серверы для управления статическими файлами. Размещено на платформе CDN. (например, Ци Ню Юн)
10. План
Схема определяет набор представлений, шаблонов, статических файлов и т. д., которые можно использовать в одном приложении. Простое понимание Хороший инструмент для реализации модуляризации приложений, использование чертежей может сделать иерархию проекта более четкой, простой в разработке и обслуживании, обычно используется для Маршруты с одинаковым префиксом URL. Давайте рассмотрим пример, в котором не используются чертежи:
# coding=utf-8
from flask import Flask
app = Flask(__name__)
@app.route('/user/index')
def user_index():
return 'user_index'
@app.route('/user/show')
def user_show():
return 'user_show'
@app.route('/user/add')
def user_add():
return 'user_add'
@app.route('/admin/index')
def admin_index():
return 'admin_index'
@app.route('/admin/show')
def admin_show():
return 'admin_show'
@app.route('/admin/add')
def admin_add():
return 'admin_add'
if __name__ == "__main__":
app.run(debug=True)
Приведенный выше код довольно аккуратный, но есть несколько проблем:
- Если функций пользователя и администратора будет не несколько, а сотни, код будет очень большим и раздутым.
- Крупномасштабные проекты — это совместная работа нескольких человек, и если все разрабатывают в этом файле, может возникнуть головная боль при разрешении конфликтов слияния.
- Если эти два пользовательских модуля однажды не понадобятся, вам все равно нужно найти их построчно, а затем удалить код.
Мы используем план, чтобы разделить пользователя и администратора на два разных файла .py,admin.pyСодержимое файла следующее:
# coding=utf-8
from flask import Blueprint
admin = Blueprint('admin', __name__,url_prefix='/admin')
@admin.route('/index')
def admin_index():
return 'admin_index'
@admin.route('/show')
def admin_show():
return 'admin_show'
@admin.route('/add')
def admin_add():
return 'admin_add'
user.pyСодержимое файла следующее:
# coding=utf-8
from flask import Blueprint
user = Blueprint('user',__name__)
@user.route('/index')
def user_index():
return 'user_index'
@user.route('/show')
def user_show():
return 'user_show'
@user.route('/add')
def user_add():
return 'user_add'
Зарегистрируйте план, содержимое кода hello.py выглядит следующим образом:
# coding=utf-8
from flask import Flask
from admin import *
from user import *
app = Flask(__name__)
app.register_blueprint(admin)
app.register_blueprint(user, url_prefix='/user')
if __name__ == "__main__":
print(app.url_map)
app.run(debug=True)
использоватьapp.url_mapФункция для просмотра всех маршрутов, результаты печати следующие:
Map([<Rule '/admin/index' (GET, HEAD, OPTIONS) -> admin.admin_index>,
<Rule '/admin/show' (GET, HEAD, OPTIONS) -> admin.admin_show>,
<Rule '/admin/add' (GET, HEAD, OPTIONS) -> admin.admin_add>,
<Rule '/user/index' (GET, HEAD, OPTIONS) -> user.user_index>,
<Rule '/user/show' (GET, HEAD, OPTIONS) -> user.user_show>,
<Rule '/user/add' (GET, HEAD, OPTIONS) -> user.user_add>,
<Rule '/static/<filename>' (GET, HEAD, OPTIONS) -> static>])
url_prefix
Этот параметр используется для установкиrequest.url
префикс URL в , и только те запросы, которые удовлетворяют этому префиксу, будут
Запрос обрабатывается и возвращается через метод просмотра зарегистрированной схемы. Может быть записан в подмодуле или вregister_blueprint
Передайте его при регистрации плана, просто передайте его один раз! Затем откройте http://127.0.0.1:5000/admin/index, вы увидите
Результат, как показано на рисунке:
10. g объект и функция хука
Иногда очень полезно выполнить какой-то конкретный код до и после обработки запроса, который использует ловушку запроса, например: создание ссылки db перед запросом, Для проверки личности пользователя и т. д. в flask предусмотрена функция регистрации общих функций, нужно только написать хук-функцию запроса, и весь экземпляр программы применяется глобально. Например, пример проверки статуса пользователя перед запросом, переход на страницу входа без входа и т. д. Функция ловушки должна использовать глобальную переменную Flask g, g в качестве промежуточной переменной, Передавайте данные между функциями ловушек и функциями просмотра.
0x1 г объект
g, global и объекты g специально используются для сохранения пользовательских данных, а сохраненные данные могут использоваться глобально. Пример кода выглядит следующим образом:
from flask import g, request
@app.route('/')
def index():
user = request.args.get('user')
g.user = user # 保存用户数据
Функция ловушки 0x2
Flask предоставляет следующие четыре функции ловушек:
- before_first_request: Вызывается перед первым запросом, в этом методе можно выполнять некоторые операции инициализации.
- before_request: Вызывается перед каждым запросом, как правило, для проверки, если проверка не удалась, вы можете ответить прямо в этом методе, а если вы вернетесь напрямую, функция просмотра не будет выполнена.
- after_request: он будет вызываться после выполнения функции просмотра, и ответ, сгенерированный функцией просмотра, передается, и ответ может быть обработан на последнем шаге в этом методе.
- teardown_request: Будет вызываться после каждого запроса и получать параметр - сообщение об ошибке сервера.
Напишите программу для проверки потока выполнения следующей функции ловушки (после запуска посетите дважды):
127.0.0.1 - - [30/Aug/2018 10:53:42] "GET / HTTP/1.1" 200 -
before_first_request
before_request
after_request
teardown_request
127.0.0.1 - - [30/Aug/2018 10:53:45] "GET / HTTP/1.1" 200 -
before_request
after_request
teardown_request
11. Контекст
Контекст эквивалентен контейнеру, который сохраняет некоторую информацию в процессе работы программы Flask и делится на два типа по механизму управления:
-
контекст запроса(Контекст запроса)Request: объект запроса, который инкапсулирует содержимое запроса Http;Session: перезагрузить информацию о сеансе, связанную с посетителем, на основе файла cookie в запросе.
-
контекст программы(Контекст приложения)g: Объект, используемый для временного хранения при обработке запросов, который сохраняет глобальные переменные текущего запроса.Разные запросы будут иметь разные глобальные переменные!current_app: Экземпляр текущей запущенной программы, который сохраняет переменные приложения. Например, вы можете использовать current_app.name, чтобы получить имя текущего приложения. Вы также можете хранить некоторую информацию о конфигурации, переменные и т. д. в current_app, например: current_app.text = 'value'.
Во Flask управление контекстом можно разделить на три этапа:
- когда приходит запрос: инкапсулировать запрос и сеанс в класс RequestContext, приложение g в класс AppContext, И поместите RequestContext и AppContext в класс Local через LocalStack.
- функция просмотра: получить значение через локальный прокси -> частичная функция -> локальный стек -> локальный.
- до завершения запроса: выполнить save.session() -> каждый раз выполнить pop() -> очистить данные локально.
12. Обработка исключений
В процессе разработки, когда в фоновом режиме возникает исключение, но вы не хотите показывать исключение пользователю или вам нужна такая же обработка, вы можете использовать функцию abort() Активно генерировать исключение, перехватывать исключение, а затем возвращать улучшенную страницу, наиболее распространенной из которых является 404. Пример кода выглядит следующим образом:
@app.route("/test")
def test():
abort(404)
@app.errorhandler(404)
def error(e):
return "一个精美的404页面"
После выполнения кода браузер вводит:http://127.0.0.1:5000/test, вы можете увидеть результаты, как показано на рисунке:
Кроме того, вы также можете записать всю обработку исключений в план, пример кода выглядит следующим образом:
# coding=utf-8
from flask import Blueprint, abort
exception = Blueprint('exception', __name__)
@exception.errorhandler(404)
def error(e):
return "一个精美的404页面"
# 注册蓝图
from error import exception
app.register_blueprint(exception, url_prefix='/error')
13. Каркас ORM — SQLAlchemy
Используйте инфраструктуру Object-Relational Mapper ORM для работы с базой данных. Так называемая структура ORM:
"Преобразование низкоуровневых инструкций по обработке данных в высокоуровневые объектно-ориентированные операции."
Нет необходимости писать громоздкие операторы операций SQL, а структуру ORM можно использовать для упрощения работы с объектами Python.
表映射成类
,行作为实例
,字段作为属性
.
Когда ORM выполняет операции с объектами, соответствующие операции преобразуются в собственные операторы базы данных. Наиболее широко используемой инфраструктурой ORM в Python является SQLAlchemy.
0x1 установить колбу-sqlalchemy
Просто используйте команду pip для установки
pip install flask-sqlalchemy
Кроме того, сама SQLAlchemy не может управлять базой данных, полагаясь наpymysqlи другие сторонние библиотеки, есть модуль Dialect, посвященный Взаимодействуйте с API данных и вызывайте различные API базы данных в соответствии с различными файлами конфигурации, чтобы реализовать работу базы данных. использование базы данных Ограничение URL-адресов, распространенные механизмы баз данных и соответствующие им URL-адреса показаны в следующей таблице:
механизм базы данных | URL |
---|---|
MySQL | mysql+pymysql://username:password@hostname/database |
Postgres | postgresql://username:password@hostname/database |
SQLite(Unix, первые четыре косые черты) | sqlite:////absolute/path/to/database |
SQLite (Windows) | sqlite:///c:/absolute/path/to/database |
Postgres | postgresql://username:password@hostname/database |
Oracle | oracle://username:password@hostname/database |
Краткое описание параметров:
- username: Имя пользователя для входа в базу данных.
- password: Пароль для входа в базу данных.
- hostname: Главное предложение, в котором находится служба SQL, которая может быть локальной или удаленной.
- database: Используемая база данных.
0x2 подключиться к базе данных
Пример кода для подключения к базе данных MySQL выглядит следующим образом:
from sqlalchemy import create_engine
engine = create_engine('mysql+pymysql://jay:zpj12345@localhost:3306/todo')
with engine.connect() as con:
rs = con.execute("SELECT 1")
print(rs.fetchone())
Вывод выглядит следующим образом:
(1,)
Кроме того, SQLAlchemy можно инициализировать следующими методами.Пример кода выглядит следующим образом:
from flask_sqlalchemy import SQLAlchemy
db = SQLAlchemy()
app = Flask(__name__)
db.init_app(app)
0x3 Использовать собственный SQL
sqlalchemy поддерживает прямое выполнение собственных операторов SQL.Примеры кода следующие:
from sqlalchemy import create_engine
engine = create_engine('mysql+pymysql://jay:zpj12345@localhost:3306/todo')
with engine.connect() as con:
con.execute("CREATE TABLE IF Not Exists note(_id INT AUTO_INCREMENT PRIMARY KEY, tran TEXT, status int)")
con.execute("INSERT INTO note(tran, status) VALUES ('吃饭', 1)")
con.execute("INSERT INTO note(tran, status) VALUES ('睡觉', 1)")
rs = con.execute("SELECT * FROM note")
for row in rs:
print(row)
Вывод кода выглядит следующим образом:
(1, '吃饭', 1)
(2, '睡觉', 1)
Модель 0x4 ORM и основные операции
Продемонстрируйте волну основных операций Flask-SQLAlchemy:
- 1.построить таблицу(create_all, можно использовать соответствующую таблицу удаленияdrop_all)
# models.py
from manager import db
class Note(db.Model):
__tablename__ = 'note'
_id = db.Column(db.INTEGER, primary_key=True, autoincrement=True)
tran = db.Column(db.TEXT)
status = db.Column(db.INT,default=0)
db.create_all() # 创建表
- 2.вставить данные
from model import Note
from manager import db
def create_note():
# 创建一个新对象
note1 = Note()
note1.tran = "吃饭"
note1.status = "1"
note2 = Note()
note2.tran = "睡觉"
note2.status = "2"
# 将新建笔记添加到数据库会话中
db.session.add(note1)
db.session.add(note2)
# 将数据库会话中的变动提交到数据库中,如果不commit,数据库内容是不会变化的
db.session.commit()
create_note()
- 3.удалить данные
def delete_note():
# 获取笔记对象(这里是获取_id=1的记录)
note = Note.query.filter_by(_id=1).first()
# 删除笔记
db.session.delete(note)
# 提交数据库会话
db.session.commit()
delete_note()
- 4.изменить данные
def update_note():
# 获取笔记对象(这里是获取_id=2的记录)
note = Note.query.filter_by(_id=2).first()
# 修改笔记内容
note.tran = "打豆豆"
# 提交数据库会话
db.session.commit()
update_note()
- 5.Данные запроса
Когда дело доходит до запроса, должны быть условия запроса.SQLAlchemy предоставляет общие функции запросов, как показано в следующей таблице:
функция | описывать | Пример использования |
---|---|---|
filter_by | Точный запрос | filter_by(xxx='xxx') |
filter | нечеткий запрос | filter(xxx.endWith('xxx')) |
get(первичный ключ) | Запрос на основе первичного ключа, обычно id | get(1) |
not_() | Для логического отрицания вы также можете напрямую заменить == на != | not_(xxx='xxx') |
and_() | логический и | and_(xxx='xxx') |
or_() | логический или | or_(xxx='xxx') |
in_() | в определенном диапазоне | XXX.xxx.in_((1,2,3)) |
notin_() | не в определенном диапазоне | XXX.xxx.notin_((1,2,3)) |
first() | Возвращает запрошенный объект | XXX.query.first() |
all() | Возвращает все запрошенные объекты | XXX.query.all() |
order_by() | Сортировать | XXX.order_by(xxx.xxx.desc()) |
limit() | Ограничьте количество возвращаемых товаров | XXX.limit(3) |
offset() | установить смещение | XXX.offset() |
count() | Возвращает общее количество записей | xxx.count() |
Пример кода выглядит следующим образом:
from sqlalchemy import not_, or_
def query_all():
notes = Note.query.all()
print("查询全部数据:", notes)
note = Note.query.filter(not_(or_(Note.tran == '吃饭', Note.tran == '睡觉'))).first()
print(note._id, ":", note.tran, ":", note.status)
if __name__ == '__main__':
# 先插入几条数据
create_note()
create_note()
query_all()
Результат выглядит следующим образом:
查询全部数据: [<Note 2>, <Note 3>, <Note 4>, <Note 5>, <Note 6>]
2 : 打豆豆 : 2
14. Плагин веб-формы — Flask-WTF
Flask вообще не использует исходную форму напрямую, а расширяет ее через Flask-WTF, который просто наследует WTForms, включая CSRF (Подделка запроса на основе разных источников), возможность проверки данных формы, загрузки файлов и встроенной в Google капчи.
Стандартные поля HTML 0x1, поддерживаемые WTForms
Тип поля | инструкция |
---|---|
StringField | текстовое поле |
TextAreaField | многострочное текстовое поле |
PasswordField | текстовое поле пароля |
HiddenField | скрыть текстовое поле |
DateField | Текстовое поле, значение в формате datetime.date |
DateTimeField | Текстовое поле, значение в формате datetime.datetime |
IntegerField | текстовое поле, значение является целым числом |
DecimalField | Текстовое поле со значением decimal.Decimal |
FloatField | текстовое поле, значение является числом с плавающей запятой |
BooleanField | Чекбокс со значениями True и False |
RadioField | набор радиокнопок |
SelectField | раскрывающийся список |
SelectMultipleField | Выпадающий список для выбора нескольких значений |
FileField | поле загрузки файла |
SubmitField | кнопка отправки формы |
FormField | Встроить форму как поле в другую форму |
FieldList | набор полей указанного типа |
0x2 Функция проверки WTForms
функция проверки | инструкция |
---|---|
Подтвердите адрес электронной почты | |
EqualTo | Сравнивает значения двух полей, часто используется в ситуациях, когда для подтверждения требуется два пароля |
IPAddress | Подтвердите сетевой адрес IPv4 |
Length | Проверить длину входной строки |
NumberRange | Убедитесь, что введенное значение находится в диапазоне чисел |
Optional | Пропустить другие функции проверки, когда нет входного значения |
Required | Убедитесь, что в поле есть данные |
Regexp | Проверяйте входные значения с помощью регулярных выражений |
URL | Проверить URL |
AnyOf | Убедитесь, что введенное значение находится в списке дополнительных значений. |
NoneOf | Убедитесь, что входное значение не в дополнительном списке |
0x3 Напишите простой пример
Далее напишем пример регистрационной формы:
# coding=utf-8
from flask import Flask, request, render_template
from flask_wtf import FlaskForm
# 导入自定义表单需要的字段
from wtforms import SubmitField, StringField, PasswordField
# 导入表单验证
from wtforms.validators import DataRequired, EqualTo
app = Flask(__name__)
app.config['SECRET_KEY'] = '123456'
# 自定义表单类
# StringField和PasswordField用于区分文本框类型
# 第一个参数是label值,第二个参数validators是要验证的内容
class RegisterForm(FlaskForm):
username = StringField('用户名:', validators=[DataRequired()])
password = PasswordField('密码:', validators=[DataRequired()])
password2 = PasswordField('确认密码:', validators=[DataRequired(), EqualTo('password', '两次输入的密码不一致!')])
submit = SubmitField('注册')
@app.route("/register", methods=['GET', 'POST'])
def register():
# 实例化注册表单类
register_from = RegisterForm()
if request.method == 'POST':
# 获取请求参数参数
username = request.form.get('username')
password = request.form.get('password')
password2 = request.form.get('password2')
# 调用validation_on_submit,一次性执行完所有验证函数的逻辑
if register_from.validate_on_submit():
return '注册成功!'
else:
return '前后密码不一致!'
return render_template('register.html', form=register_from)
if __name__ == "__main__":
print(app.url_map)
app.run(debug=True)
# templates/register.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<form method="post">
{# 设置scrf_token #}
{{ form.csrf_token() }}
{{ form.username.label }} {{ form.username }}<br>
{{ form.password.label }} {{ form.password }}<br>
{{ form.password2.label }} {{ form.password2 }}<br>
<br>
{{ form.submit }}
</form>
</body>
</html>
Введите волну одного и того же пароля и разных паролей, и вывод браузера будет следующим:
Еще одно замечание:
использоватьFlask-WTFнеобходимостьПараметр конфигурации SECRET_KEY,CSRF_ENABLEDОн предназначен для защиты от **CSRF (подделки межсайтовых запросов)**. SECRET_KEY используется для генерации зашифрованных токенов.При активации CSRF этот параметр будет генерировать зашифрованные токены в соответствии с заданным ключом.
15. Простая и универсальная структура проекта Flask
Основы Flask почти изучены, а затем мы будем стандартизировать структуру проекта.Относительно простая и общая структура проекта показана на рисунке:
Кратко о структуре:
- app: каталог пакета для всего проекта.
- models: Модель данных.
- static: Статические файлы, css, JavaScript, иконки и т. д.
- templates: файл шаблона.
- views: Посмотреть файл.
- config.py: Конфигурационный файл.
- venv: Виртуальная среда.
- manage.py: Файл управления запуском проекта.
- requirements.txt: Файл управления запуском проекта.
Создать процесс:
существует__init__.py
Инициализируйте экземпляр приложения в , код выглядит следующим образом:
from flask import Flask
app = Flask(__name__)
Напишите простой индексный маршрут в views.py:
from app import app
from flask import render_template
@app.route('/')
def index():
return render_template("index.html")
Создайте index.html в папке шаблонов:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<h1>Hello Flask!</h1>
</body>
</html>
Затем введите:python manage.py runserver, открывается браузер:http://127.0.0.1:5000/
Структура проекта в основном готова, а затем мы переносим проект на удаленный сервер.
16. Разверните проект Flask на облачном сервере
Загрузка кода 0x1 на облачный сервер
Есть два дополнительных метода, самый простой — загрузить напрямую через FTP/SFTP. Другой - разместить проект на Платформа для размещения кода, такая как Github, а затем напрямую ssh к облачному серверу и используйте команду git clone для копирования проекта. Скопируйте на сервер, здесь автор напрямую использует первый способ для загрузки проекта на облачный сервер.
0x2 установить nginx
Nginx — это легкое, высокопроизводительное программное обеспечение обратного прокси-сервера с низким уровнем загрузки, которое очень хорошо справляется с высокой степенью параллелизма. Веб-сервер, поставляемый с Flask, может открывать только один поток. Можно протестировать его самостоятельно, но он не будет работать, если вы разместите его в сети. Здесь Мы используем Nginx и устанавливаем его напрямую через команду apt-get, которая выглядит следующим образом:
apt-get install nginx
После завершения установки получите доступ к общедоступному IP-адресу сервера из внешней сети, и появится следующая страница, указывающая на то, что установка прошла успешно:
После установки Nginx по умолчанию будет создана директория:/var/www/, напрямую скомандовав нашему Проект перемещается по этому пути.
mv AutoPubNews /var/www/AutoPubNews
0x3 Установить и настроить uwsgi
WSGI — этовеб сервер, илиинтерфейс шлюза, веб-сервер (например, nginx) и сервер приложений Спецификация (протокол) для связи (например, uWSGI). А uWSGI реализует все интерфейсы WSGI и является Быстрый, самовосстанавливающийся, удобный для разработчиков и системных администраторов сервер. Код uWSGI полностью написан на C, Высокая эффективность и стабильная работа. Например: uWSGI преобразует протокол HTTP в протокол WSGI, чтобы Python мог Используйте напрямую. Введите команду pip непосредственно для установки:
pip install uwsgi
Как правило, его можно установить напрямую, но в случае ошибки можно сначала попробовать установить libpython3.x-dev. Например, версия автора 3.5:
apt-get install libpython3.5-dev
Затем настройте егоuwsgi, создайте в проекте новый config.ini в качестве конфигурационного файла:
vim config.ini
Добавьте следующее:
[uwsgi]
# uwsgi 启动时所使用的地址与端口
socket = 127.0.0.1:8001 # 可以使用其他端口
# 指向网站目录
chdir = /var/www/AutoPubNews
# python 启动程序文件
wsgi-file = manage.py
# python 程序内用以启动的 application 变量名
callable = app
# 处理器数
processes = 4
# 线程数
threads = 2
#状态检测地址
stats = 127.0.0.1:5000
Затем выполните следующую команду:
uwsgi config.ini
Появляется: Сервер статистики включен на 127.0.0.1:5000, что означает нормальный запуск.
0x4 Настройка Nginx
Затем настройте Nginx, не трогая стандартный nginx.conf, напрямую:/etc/nginx/sites-available/default
Перезапишите его, создайте новый файл по умолчанию и добавьте следующее:
server {
listen 80;
server_name _;
location / {
include uwsgi_params;
uwsgi_pass 127.0.0.1:8001; # 指向uwsgi 所应用的内部地址,所有请求将转发给uwsgi 处理
uwsgi_param UWSGI_PYHOME /home/www/AutoPubNews/venv; # 指向虚拟环境目录
uwsgi_param UWSGI_CHDIR /home/www/AutoPubNews; # 指向网站根目录
uwsgi_param UWSGI_SCRIPT manager:app; #
}
}
Затем введите следующую команду, чтобы перезапустить и загрузить конфигурацию nginx:
sudo service nginx restart
Затем запустите uwsgi, после чего вы сможете напрямую обращаться к нашему проекту через общедоступный сетевой ip сервера:
разрешение доменного имени 0x5
Использование ip каждый раз, когда мы обращаемся к проекту, кажется немного громоздким.Мы можем купить доменное имя для сопоставления. Просто купите доменное имя напрямую. Вам нужно его записать. После того, как вы это сделаете, откройте страницу управления доменным именем и найдите доменное имя, которое вы только что купили. Нажмите, чтобы проанализировать
Затем нажмите «Добавить запись», появится диалоговое окно, как показано на рисунке, и значение записи может быть заполнено IP-адресом общедоступной сети вашего облачного сервера.
На данный момент мы можем получить доступ к нашему проекту напрямую через доменное имя.
Хорошо, о быстром успехе Flask, в следующем разделе мы будем использовать Flask для написания API-интерфейсов, динамической генерации страниц и так далее. Если у вас есть какие-либо вопросы, пожалуйста, оставьте сообщение в области комментариев, спасибо~
Советы: Официальная учетная запись в настоящее время только настаивает на отправке утренней газеты, и она постепенно улучшается. Я чувствую себя немного виноватым. Я осмеливаюсь опубликовать только маленькую картинку. Если вы хотите увидеть утреннюю газету, вы можете обратить внимание~