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

Shopyo: Улучшите свою колбу, изучив приложение Advanced Flask

Изучите Flask больше, погрузившись в проект с открытым исходным кодом. Tagged Flask, Python, Shopyo, новички.

Shopyo представляет собой решение для инвентаризации с открытым исходным кодом, инвентаризация Python и предстоящая точка продаж. Цель-помочь владельцам малого бизнеса получить хороший продукт на основе Python с важными удобствами для своего бизнеса.

Пустой проект Shopyo, по крайней мере, создает отличную базу фляжки.

Взгляд на требования Shopyo.txt дает

flask
flask_sqlalchemy
marshmallow_sqlalchemy
flask_marshmallow
flask_migrate
flask_script
flask_login
Flask-WTF
requests
  • flask_sqlalchemy

Flask_sqlalchemy – это обертка вокруг Sqlalchemy, популярного Python Orm. ORM позволяет вам определить ваши таблицы SQL без необходимости записать коды SQL. Вы просто определяете модели, и таблица создана для вас. Типичная модель выглядит так:

class Settings(db.Model):
    __tablename__ = 'settings'
    setting = db.Column(db.String(100), primary_key=True)
    value = db.Column(db.String(100))
  • flask_migrate

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

  • flask_marshmallow
  • Marshmallow_sqlalchemy

Marshmallow – это проект, который позволяет создавать API REST. Flask_marshmallow позволяет легко интегрировать зефир с помощью Flask, а Marshmallow_sqlalchemy – это необходимый пакет, который идет вместе.

  • flask_script

Несмотря на то, что Flask_Script устарела официальной командной строкой Flask, позволяет легко создавать сценарии для управления приложением Flask.

  • flask_login

Flask Login позволяет добавлять аутентификацию в ваше приложение.

  • Flask-wtf

Пакет, который позволяет создавать формы. Мы используем его, чтобы предотвратить атаки CSRF (произношенный морской прибой). Это в основном гарантирует, что вы не вмешиваетесь на веб -страницу, затем попытайтесь отправить ее кому -то другому, ожидая, что она будет работать

  • Запросы

Пакет для выполнения веб -запросов и легко втягивает URL -адреса. Вы можете просмотреть учебник об этом здесь

модель

Модель определяет вашу таблицу

class Settings(db.Model):
    __tablename__ = 'settings'
    setting = db.Column(db.String(100), primary_key=True)
    value = db.Column(db.String(100))

Создает таблицу с именем настройки с полями с именем настройки и значением

шаблон

Шаблон – это HTML -файл с оставшимися пространствами для значений. {% и {{ иметь особое значение. {{1 + 1}} будет отображать 2 при визуализации. Аналогично {{x + 1}} оценит выражение перед рендерингом.

{% extends "base/main_base.html" %}

{% set active_page ='settings' %}

{% block pagehead %}
Settings

{% endblock %}

{% block content %}



{% for setting in settings %}
    
{%endfor%}
  
Settings Value
{{setting.setting}} {{setting.value}}
{% endblock %}

Давайте возьмем этот фрагмент

{% extends "base/main_base.html" %}

Говорит, что мы наследуем от base.html

Это облегчает нашу жизнь, не копируя целое или <Скрипт> Коды, например, или нет, отбирая заголовок/нижний колонтитул

{% block pagehead %}
...
{% endblock %}


{% block content %}
...
{% endblock %}

позволяет нам определить нашу голову и тело соответственно.

Файл представления имеет много маршрутов и что происходит, когда находится такой маршрут. Это файл представления настроек, например,

from flask import (
    Blueprint, render_template, request, redirect, url_for, jsonify
    )

from addon import db
from views.settings.models import Settings
from flask_marshmallow import Marshmallow
from flask_login import login_required, current_user

from project_api import base_context


settings_blueprint = Blueprint('settings', __name__, url_prefix='/settings')

@settings_blueprint.route("/")
@login_required
def settings_main():
    context = base_context()

    settings =  Settings.query.all()

    context['settings'] = settings
    return render_template('settings/index.html', **context)

...

Вот разрушение:

from flask import (
    Blueprint, render_template, request, redirect, jsonify
    )
  • План

Позволяет нам создавать чертежи. Подробнее об этом дальше на

  • render_template

return render_template (имя файла) возвращает рендерированный HTML

  • запрос

относится к входящему веб -запросу, с помощью которого мы можем проверить на получение или публиковать методы

  • перенаправить

перенаправление на другой URL

  • jsonify

Возвращает строку или словарь в качестве ответа JSON

from addon import db

аддон содержит следующее:

from flask_sqlalchemy import SQLAlchemy
from flask_marshmallow import Marshmallow
from flask_login import LoginManager

db = SQLAlchemy()
ma = Marshmallow()
login_manager = LoginManager()
from views.settings.models import Settings

Подсказывает нам, чтобы перейти к папке Views -> Папка «Настройки» -> Файл моделей

...
from project_api import base_context

Project_api.py Содержит base_context, который возвращает только словарь

def base_context():
    base_context = {
        'APP_NAME': get_setting('APP_NAME'),
        'SECTION_NAME': get_setting('SECTION_NAME'),
        'SECTION_ITEMS': get_setting('SECTION_ITEMS')
    }
    return base_context.copy()

Мы копируем так, чтобы не позволить дополнениям быть глобальными. Шаблоны Rener принимают переменные, которые будут представлены в виде ключевых слов. Но эти 3 переменные отображаются везде, поэтому вместо того, чтобы копировать вставку каждый раз, мы просто добавляем в этот словарь.

settings_blueprint = Blueprint('settings', __name__, url_prefix='/settings')

Это говорит о том, что в этом файле будет рассматриваться все URL -адреса, которые начинаются с/настройки/настроек.

@settings_blueprint.route("/abc")

на самом деле для URL /Настройки/ABC

@settings_blueprint.route("/")
@login_required
def settings_main():
    context = base_context()

    settings =  Settings.query.all()

    context['settings'] = settings
    return render_template('settings/index.html', **context)

Контекст – это просто словарь

context['settings'] = settings

передает переменную настройки, которую использует цикл для цикла в шаблоне

{% for setting in settings %}
    
      {{setting.setting}}
      {{setting.value}} 
      
    
{%endfor%}

Кстати,

context['settings'] = settings
return render_template('settings/index.html', **context)

такой же как

return render_template('settings/index.html', 
    settings=settings,
    APP_NAME=get_setting('APP_NAME'),
    SECTION_NAME=get_setting('SECTION_NAME'),
    SECTION_ITEMS=get_setting('SECTION_ITEMS'))

в app.py ты увидишь

    from views.settings.settings_modif import settings_blueprint

    app.register_blueprint(settings_blueprint)

который добавляет представления папки «Настройки» в приложение.

в config.py мы видим

class Config:
    """Parent configuration class."""
    DEBUG = False
    SQLALCHEMY_DATABASE_URI = 'sqlite:///test.db'
    SQLALCHEMY_TRACK_MODIFICATIONS = False
    SECRET_KEY = 'qow32ijjdkc756osk5dmck'  # Need a generator
    APP_NAME = 'Demo'
    SECTION_NAME = 'Manufacturer'
    SECTION_ITEMS = 'Products'
    HOMEPAGE_URL = '/manufac/'


class DevelopmentConfig(Config):
    """Configurations for development"""
    ENV = 'development'
    DEBUG = True


app_config = {
    'development': DevelopmentConfig,
    'production': Config,
}

Тогда в app.py

def create_app(config_name):
    app = Flask(__name__)
    app.config.from_object(app_config[config_name])
    ...

затем дальше вниз

app = create_app('development')

Итак, если мы введем «производство», он загрузит производственные конфигурации.

Как информация, создание приложений таким образом называется заводской шаблоном App

manage.py

migrate = Migrate(app, db, compare_type=True)
manager = Manager(app)

manager.add_command('db', MigrateCommand)

Позволяет нам пройти нормальные команды миграции алембической миграции

Нормальные команды Alembic работают как:

alembic db init
alembic db migrate
alembic db upgrade

но используя приведенный выше код, Мы автоматически получаем

python manage.py db init
python manage.py db migrate
python manage.py db upgrate

Точно так же:

@manager.command
def runserver():
    app.run()

позволяет нам иметь

python manage.py runserver

Это было написано как часть документов Shopyo, но, кстати, отличный пост!

Если вы чего -то не поняли, пожалуйста, пинг меня

arj.python at gmail dot com

Оригинал: “https://dev.to/abdurrahmaanj/shopyo-enhance-your-flask-by-exploring-an-advanced-flask-app-40j3”