Этот учебник не предназначен для начинающих. Предполагается, что читатель знаком с фреймой колба.
В этом руководстве мы будем писать колбу, используя Флясные чертежи
и Применение заводской шаблон
Отказ
Что такое чертежи?
Если вы работаете над небольшим проектом, сохраняя весь ваш код в одном модуле не плохой идеей. Однако для крупных проектов обычная практика разделить ваш проект в многочисленные пакеты, используя сквозные чертежи.
Чертеж – это файл, который содержит один кусок функциональности в вашем приложении. Рассмотрим приложение Flask, построенное с чертежами как коллекцию критических битов функциональности, которые работают вместе, чтобы создать полное веб-приложение.
Это хорошая идея, чтобы подумать о том, какие чертежи вы можете нарушить ваше заявление, прежде чем начать писать. Я обычно использую три чертежа, API.
, Пользователь
и админ
в моем личном подходе. API
Чертеж добавлен для обработки программного доступа к ресурсам веб-приложений. Функциональность, связанная с пользователем, обрабатывается Пользователь
Чертеж, включая регистрацию, выйти, логин, сброс пароля и т. Д. План администратора отвечает за функции и функции и функции администратора.
|-app.py |-.gitignore |-README.md |-requirements.txt |-logs/ |-app_name/ |-__init__.py |-.env |-models/ |-utils/ |-forms/ |-config/ |-config.py |-database.py |-static/ |-templates/ |-layout.html |-400.html |-403.html |-404.html |-405.html |-500.html |-routes/ |-__init__.py |-api.py |-user.py |-admin.py |-templates |-user/ |-register.html |-admin/ |-panel.html
В следующей таблице дает обзор того, что каждый файл и папка делает
Файл, который содержит экземпляр приложения Flask для запуска приложения | app.py |
Файл, который содержит все зависимости приложения | requirements.py |
Папка, которая содержит журналы приложений | журналы / |
” Файл, который содержит переменные среды, как SENTER_KEY | app_name / .env. |
Папка, которая содержит чертежи и шаблоны, связанные с ними | app_name / маршруты |
Файл, где мы собираем разные компоненты приложения колба | app_name / __ init__.py |
Папка, которая содержит модели базы данных | app_name / Модели / |
Папка, которая содержит основные услуги, такие как объект доступа к базе данных (DAOS) | app_name / usils / |
Папка, которая содержит формы колба | app_name / forms / |
Файл, который содержит конфигурации приложения Flask | app_name / config / config.py |
Файл, который содержит конфигурации базы данных | app_name / config / database.py |
” Папка, которая содержит все CSS | app_name / static. |
Папка, которая содержит базовый шаблон и страницы ошибок приложения | app_name / шаблоны |
Поскольку мы организовали нашу заявку на чертежи, вместо отправки запросов на прикладную экземпляр приложения в колбе, который будет обрабатываться, сервер теперь отправляет их в соответствующий план. Чертежи должны «регистрировать» с экземпляром приложения Flask, чтобы экземпляр приложения Flask для знания о чертежах и маршрутах проекта.
Управление конфигурацией
Есть несколько способов настроить приложение Flask, но в этом руководстве мы будем использовать .env
Объекты файла и Python.
На практике вы не хотели бы жесткокодировать значение важных параметров, таких как Секретный ключ
, Имя пользователя почтового сервера
и пароль
и многое другое в config.py
файл по соображениям безопасности.
Оценка производства или Действительно Нуб Способ определения важных Параметры – написать их в .env
файл. Пакет Python Python-dotenv
это удобный маленький инструмент. После установки пакета вам нужно будет создать .env
Файл в корневом каталоге вашего проекта, чтобы определить все вашу переменные среды. load_dotenv ()
Функция в вашем файле config.py используется для загрузки настроек конфигурации среды из .env
файл. Вы должны помнить, чтобы включить .env
Файл к вашему .gitignore
Файл Если вы используете эту технику.
Ваш .env
файл
CONFIG_ENV = Development ENV = development SECRET_KEY = 'DamnSIMpLeSecREtKEy' DATABASE_URI = 'mysql+pymysql://user:password@hostname:port/database_name' MAIL_USERNAME = mail_user MAIL_PASSWORD = mail_password MAIL_DEFAULT_SENDER = mail_sender
Ваш config.py
файл
from os import path, environ from dotenv import load_dotenv # Absolute path of app_name directory BASE_DIR = path.abspath(path.dirname(path.dirname(__file__))) # Loading configuration variable into the environment from .env file load_dotenv(path.join(BASE_DIR, '.env')) class Config: """ Base class configuration, common to all other config classes """ SECRET_KEY = environ.get('SECRET_KEY', 'samplesecret_key') WTF_CSRF_ENABLED = True SQLALCHEMY_TRACK_MODIFICATIONS = False MAIL_SERVER = 'smtp.googlemail.com' MAIL_USE_SSL = True MAIL_PORT = 465 MAIL_USE_TLS = False MAIL_SUPPRESS_SEND = False MAIL_USERNAME = environ.get('MAIL_USERNAME', '') MAIL_PASSWORD = environ.get('MAIL_PASSWORD', '') MAIL_DEFAULT_SENDER = environ.get('MAIL_USERNAME', '') class Development(Config): """Configuration settings for development environment""" DEBUG = True TESTING = False ENV = 'development' DATABASE_URI = environ.get("DATABASE_URI") class Production(Config): """Configuration settings for production environment""" DEBUG = False TESTING = False ENV = 'production' DATABASE_URI = environ.get("PROD_DATABASE_URI") class Testing(Config): """Configuration settings for testing environment""" TESTING = True WTF_CSRF_ENABLED = False MAIL_SUPPRESS_SEND = True DATABASE_URI = environ.get("TEST_DATABASE_URI")
Ваш app_name/__ init__.py
файл
from flask import Flask from os import environ from .config.config import Development, Production def create_app(): app = Flask(__name__) if environ.get('CONFIG_ENV') == 'Development': app.config.from_object(Development()) else: app.config.from_object(Production()) @app.route("/",methods=['GET']) def index(): return 'App is Running
' return app
Ваш app.py
файл
from os import environ from app_name import create_app app = create_app() if __name__ == "__main__": app.run()
Создание чертежи
Чертежи определяются путем создания экземпляра класса BluePrint. Аргументы, переданные конструктору класса, являются названием чертежа и название папки, содержащего шаблоны, принадлежащие к чертеже, и префикс URL-адреса для дифференцировки между аналогичными маршрутами различных чертежей. Затем вам нужно написать маршруты этого план.
Ваш app_name/marross/api.py
файл
from flask import Blueprint def create_blueprint(): """Instantiating api blueprint and returning it""" api = Blueprint('api', __name__, template_folder='templates', url_prefix='/api') @api.route('/info',methods=['GET']) def info(): return 'Sample Route
' return api
Ваш app_name/маршруты/user.py
файл
from flask import Blueprint, render_template def create_blueprint(): """Instantiating user blueprint and returning it""" user = Blueprint('user', __name__, template_folder='templates/user', url_prefix='/user') @user.route('/register',methods=['GET']) def register(): return render_template('register.html') return user
Ваш app_name/маршруты/admin.py
файл
from flask import Blueprint, render_template def create_blueprint(): """Instantiating admin blueprint and returning it""" admin = Blueprint('admin', __name__, template_folder='templates/admin', url_prefix='/admin') @admin.route('/panel',methods=['GET']) def panel(): return render_template('panel.html') return admin
Важные моменты, чтобы помнить При работе с чертежами
Любые ссылки на
приложение
Объект должен быть заменен ссылками наCurrent_app
объект. Это потому, что у вас больше нет прямой доступ к экземпляру приложения колба при работе с чертежами. Это доступно только через его прокси,Current_app
ОтказУбедитесь, что
url_for ()
Метод относится к чертению функции просмотра. Это сделано для того, чтобы отразить реальность, что определенные чертежи имеют различные функциональные возможности.URL_FOL (User.register)
.Сделайте, что объект BluePrint используется декоратором, используемым для определения любого маршрута.
Применение заводской шаблон
Мы хотим создать приложения для колб с различными конфигурациями ( Разработка, производство, тестирование
), не меняясь, не меняясь в реальном коде. Здесь функция Фабричный метод
состоит в том, чтобы раскрутить различные колбные приложения в соответствии с нашей потребностью. Завод приложений является не что иное, как из известного дизайна Фабричный способ шаблона
Отказ
Формат, чтобы сделать прикладную фабрику
- Применение приложения колба
- Загрузка конфигураций колбы приложения
- Регистрация чертежи
- Регистрация обработчиков ошибок
- Конфигурация модуля ведения журнала
Мы покрывали первые два шага в предыдущих разделах, поэтому мы будем продолжать с третьего шага.
Регистрация чертежи
Чертежи регистрируются, передавая объект BluePrint к register_blueprint ()
Метод экземпляр приложения колба открывает.
Ваш Utils/register_blueprints.py
файл
from app_name.routes import user, admin, api def register_blueprints(app): """Registering all the blueprint objects""" app.register_blueprint(user.create_blueprint()) app.register_blueprint(admin.create_blueprint()) app.register_blueprint(api.create_blueprint())
Ваш app_name/__ init__.py
файл
from flask import Flask from os import environ from .config.config import Development, Production from .utils.register_blueprints import register_blueprints def create_app(): app = Flask(__name__) if environ.get('CONFIG_ENV') == 'Development': app.config.from_object(Development()) else: app.config.from_object(Production()) # Registering Blueprints register_blueprints(app) @app.route("/",methods=['GET']) def index(): return 'App is Running
' return app
Что такое регистрация?
Это процесс сохранения официальной записи вашего заявления. Он используется для записи событий, поскольку они происходят, и является отличным инструментом для отладки любых вопросов и получение информации о работе вашего приложения.
Вы должны воспользоваться ошибками конкретных приложений, а также ошибки конкретной базы данных. Вы также можете выбрать важные функции вашего приложения. Любая чувствительная информация не должна регистрироваться, поскольку журналы хранятся в формате Flaintex.
Модуль регистрации
Обычно используется стандартный модуль для ведения журнала Python. Стандартный модуль прослеживания имеет 4 подмодуля, которые являются логики
, обработчики
, фильтры
и Форматтеры
Отказ
Логики являются объектами, которые создают сообщения журнала. Когда вы производите журнал сообщения, вы должны указать его критичность, используя функцию, связанную с уровнем критичности. Ниже приведены уровни критики (также известны как уровни регистрации), их числовые представления и функции, которые идут с ними:
- Отладка → 10 → Отладка ()
- Информация → 20 → Информация ()
- Предупреждение → 30 → Предупреждение ()
- Ошибка → 40 → Ошибка ()
- Критические → 50 → Критические ()
По умолчанию Логин
Объект может быть доступен и использоваться без требования к любой конфигурации. app.logger
Объект выставлен каждым экземпляром колбы. Если вы используете чертежи, вам нужно использовать Current_app
Объект, который представляет собой прокси для экземпляра приложения колба.
Ваш app_name/маршруты/admin.py
файл
from flask import Blueprint, render_template, current_app def create_blueprint(): """Instantiating admin blueprint and returning it""" admin = Blueprint('admin', __name__, template_folder='templates/admin', url_prefix='/admin') @admin.route('/panel',methods=['GET']) def panel(): current_app.logger.info("Admin Panel Accessed") return render_template('panel.html') return admin
Регистратор по умолчанию, к сожалению, просто печатает на консоль. В результате, если вы хотите войти в файл, вы должны создать новый экземпляр регистратора регистратора. Регистратор по умолчанию будет продолжать систему, но вы можете выключить его, если хотите:
from flask.logging import default_handler app.logger.removeHandler(default_handler)
Вы можете установить минимальный уровень критичности сообщений, которые необходимо зарегистрироваться при настройке нового экземпляра регистратора. Все журнальные сообщения с критичность этого значения или больше будут зарегистрированы, в то время как те, кто имеет критичность меньше, чем это значение, будет игнорироваться. Это удобно в случаях, когда вы не хотите Чтобы удалить вызовы журналов из исходного кода, но все еще хотите ограничить количество сообщений журнала. Вы можете увеличить минимальный уровень журнала сообщений, которые записываются в журнал, такие как Ошибка сообщения и выше.
Обработчики являются объектами, которые маршруют сообщения журнала в соответствующее местоположение. Обработчик потока – это обработчик по умолчанию, и он передает сообщения журнала к терминалу. Чтобы маршрутить журналы сообщений на разные пункты назначения, вы можете построить разные объекты обработчика.
А
FileHandler
используется для входа в файл. АSmtphandler
используется для доставки журналов сообщений в качестве электронной почты.FileHandler
Функция принимаетРасположение
иИмя
файла журнала, который вы хотите написать и создаетFileHandler
Объект, который отправляет журнальные сообщения на этот файл.В большинстве случаев
журналы
Папка используется для хранения файлов, которые выполняются во время выполнения (журналы и файлы базы данных). Эта папка должна быть добавлена к вашему.gitignore
Файл для управления версией, чтобы игнорировать его.
file_handler = logging.FileHandler('logs/application.log') app.logger.addHandler(file_handler)
Сообщения журнала записываются в один файл журнала через FileHandler
объект. В результате файл журнала может быстро расти в размере. Используя RotatingfileHandler
Объект – лучший вариант. Он также сохраняет сообщения журнала в файл, но если существующий файл журнала превосходит определенный размер, он производит новый ( MAXBYTES
). Перед перезаписью текущих файлов он будет генерировать новый файл до заданного количества файлов ( Backuppount
).
from logging.handlers import RotatingFileHandler file_handler = RotatingFileHandler('logs/application.log', maxBytes=16384, backupCount=15)
Фильтры Используются для добавления контекстной информации для журнала сообщений. Например, при регистрации запросов вы можете добавить фильтр, который включает в себя внешний IP-адрес запроса.
Форматтеры Используются для указания формата сообщений журнала. А Logrecord
Объект представляет каждое сообщение журнала. Форматтеры журнала используются для указания того, какие Logrecord
Характеристики должны отображаться и в каком порядке они должны быть отображены.
Некоторые атрибуты Logrecords:
- % (Asctime) S – DateTime Когда был создан Logrecord
- % (имя файла) S – Имя файла Pathname
- % (Funcname) S – Название функции, содержащую вызов журнала
- % (уровень уровня) S – уровень регистрации для сообщения
- % (Lineno) D – Линия Количество исходного кода, где был выдан вызов регистрации (если есть)
- % (сообщение) S – Зарегистрированное сообщение
- % (модуль) S – модуль, из которого вызов журнала было выпущено
Настроить ведение журнала
Вы должны настроить Регистрация
Прежде чем создать экземпляр приложения Flask, в противном случае он будет использовать обработчик по умолчанию, который записывает сообщения журналов на консоль. Вот почему функция прикладного завода используется для настройки журнала.
Ваш Utils/log_config.py
файл
import logging from flask.logging import default_handler from logging.handlers import RotatingFileHandler def log_config(app): # Deactivate default flask logger app.logger.removeHandler(default_handler) # File handler object file_handler = RotatingFileHandler('logs/application.log', maxBytes=16384, backupCount=15) # Set logging level of the file handler object so that it logs INFO and up file_handler.setLevel(logging.INFO) # file formatter object file_formatter = logging.Formatter('%(asctime)s %(levelname)s: %(message)s [in %(filename)s: %(lineno)d]') # Apply file formatter object to the file handler object file_handler.setFormatter(file_formatter) # Add file handler object to the logger app.logger.addHandler(file_handler)
Индивидуальная обработка ошибок
Код состояния HTTP включен в ответное сообщение, когда клиент отправляет запрос на веб-сервер. Это трехзначное число, которое представляет результат обработки запроса. На основании начальной цифры коды состояния разделены на пять категорий, каждый из которых представляет собой другой тип ответа:
- 1xx – Информационный ответ
- 2xx – Успешные ответы
200
(OK), Для успешной обработки запроса
- 3xx – Перенаправляет
302
(Найдено), для успешного перенаправления клиента к новому URL
- 4xx – Ошибки клиента
400
(Плохой запрос): когда клиент делает запрос, который сервер не может понять или не разрешать.403
(Запрещено): когда клиент пытается получить доступ к ограниченному ресурсу и не имеет разрешения для этого.404
(Не найден): когда клиент запрашивает URL, который сервер не распознает. Приведенное сообщение об ошибке должно быть что-то вдоль линий «извините, что вы ищете просто не там!».
405
(Метод не допускается): когда метод запроса не принимается по функции просмотра, которая обрабатывает запросы на данный маршрут. Приведенное сообщение об ошибке должно быть вдоль строк «Извините, запрошенный метод не поддерживается этим ресурсом!».- 5xx – Ошибки сервера
500
(Ошибка внутреннего сервера): обычно возникает из-за ошибок программирования или сервера перегружена.
Создайте свои пользовательские страницы ошибок, например: 403.html
, 500.html
, 404.html
А затем сделайте эти страницы ошибок с помощью Error_handlers.
Ваш Utils/error_handlers.py
файл
def error_handlers(app): # 403 - Forbidden @app.errorhandler(403) def forbidden(e): return render_template('403.html'), 403 # 400 - Bad Request @app.errorhandler(400) def bad_request(e): return render_template('400.html'), 400 # 404 - Page Not Found @app.errorhandler(404) def page_not_found(e): return render_template('404.html'), 404 # 405 - Method Not Allowed @app.errorhandler(405) def method_not_allowed(e): return render_template('405.html'), 405 # 500 - Internal Server Error @app.errorhandler(500) def server_error(e): return render_template('500.html'), 500
Финал app_name/__ init__.py
файл
from flask import Flask from os import environ from .config.config import Development, Production from .utils.register_blueprints import register_blueprints from .utils.error_handlers import error_handlers from .utils.log_config import log_config def create_app(): app = Flask(__name__) if environ.get('CONFIG_ENV') == 'Development': app.config.from_object(Development()) else: app.config.from_object(Production()) # Registering Blueprints register_blueprints(app) # Configure Logging log_config(app) # Registering Error Handlers error_handlers(app) @app.route("/",methods=['GET']) def index(): return 'App is Running
' return app
Заключение
Теперь вы можете похвастаться своими приятелями о том, чтобы не быть разработчиком колбы Noob.
Я надеюсь, что вам все наслаждались статьей.
Оригинал: “https://dev.to/hrk2023/writing-a-flask-app-the-noob-way-cfk”