Рубрики
Без рубрики

Написание колб приложения! Нуб

Этот учебник не предназначен для начинающих. Предполагается, что читатель знаком с колбой … Теги с Python, учебником, программированием, колбой.

Этот учебник не предназначен для начинающих. Предполагается, что читатель знаком с фреймой колба.

В этом руководстве мы будем писать колбу, используя Флясные чертежи и Применение заводской шаблон Отказ

Что такое чертежи?

Если вы работаете над небольшим проектом, сохраняя весь ваш код в одном модуле не плохой идеей. Однако для крупных проектов обычная практика разделить ваш проект в многочисленные пакеты, используя сквозные чертежи.

Чертеж – это файл, который содержит один кусок функциональности в вашем приложении. Рассмотрим приложение 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 включен в ответное сообщение, когда клиент отправляет запрос на веб-сервер. Это трехзначное число, которое представляет результат обработки запроса. На основании начальной цифры коды состояния разделены на пять категорий, каждый из которых представляет собой другой тип ответа:

  1. 1xx – Информационный ответ
  2. 2xx – Успешные ответы
    • 200 (OK), Для успешной обработки запроса
  3. 3xx – Перенаправляет
    • 302 (Найдено), для успешного перенаправления клиента к новому URL
  4. 4xx – Ошибки клиента
    • 400 (Плохой запрос): когда клиент делает запрос, который сервер не может понять или не разрешать.
    • 403 (Запрещено): когда клиент пытается получить доступ к ограниченному ресурсу и не имеет разрешения для этого.
    • 404 (Не найден): когда клиент запрашивает URL, который сервер не распознает. Приведенное сообщение об ошибке должно быть что-то вдоль линий «извините, что вы ищете просто не там!».
  • 405 (Метод не допускается): когда метод запроса не принимается по функции просмотра, которая обрабатывает запросы на данный маршрут. Приведенное сообщение об ошибке должно быть вдоль строк «Извините, запрошенный метод не поддерживается этим ресурсом!».

    1. 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”