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 %}
Settings | Value | |
---|---|---|
{{setting.setting}} | {{setting.value}} |
Давайте возьмем этот фрагмент
{% 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
передает переменную настройки, которую использует цикл для цикла в шаблоне
Кстати,
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”