Table des matières
Préparation de l'installation
pipenv
Commencez à vous entraîner
Fichier d'entrée
routing
Optimisation du routeur
SQLAlchemy
Définition de la classe de base de données
模块中定义方法
在路由中的使用
SQLAlchemy实现mysql编码、列类型
默认值和索引设置
兼容Mysql列类型
自定义数据库名和字符集编码
Maison développement back-end Tutoriel Python Comment écrire des applications Python à l'aide de Flask Blueprint et SQLAlchemy

Comment écrire des applications Python à l'aide de Flask Blueprint et SQLAlchemy

May 06, 2023 pm 07:28 PM
python sqlalchemy

    Préparation de l'installation

    python3 -V && pip3 -V
    pip3 install pipenv
    Copier après la connexion

    pipenv

    pipenv shell
    Copier après la connexion

    La configuration de l'environnement de PyCharm ne se fera pas ici. Trop d'explications, voici une explication du code suivant.

    Commencez à vous entraîner

    Flask Le principe est de lier le plan et l'application pour implémenter la fonction de routage Web lorsque l'application est initialisée. La mise en œuvre du routage est la première étape. tous les projets.

    Fichier d'entrée

    Avant de démarrer le projet, définissez un fichier d'entrée pour permettre les requêtes d'instanciation de l'application. Ce que le fichier d'entrée doit faire est d'initialiser le fichier de configuration, d'introduire le fichier d'entrée. contrôleur et initialisez la base de données.

    def create_app():
        app = Flask(__name__)
        # 导入config中的配置文件
        app.config.from_object('app.config.setting')
        app.config.from_object('app.config.secure')
        return app
    Copier après la connexion

    Appelé dans le fichier de démarrage, le jugement doit être ajouté au fichier de démarrage, la raison sera expliquée plus tard.

    from app.app import create_app
    app = create_app()
    if __name__ == '__main__':
        app.run(debug =True,port=81,host= '0.0.0.0')
    Copier après la connexion

    routing

    Flask est une fonction de routage implémentée à l'aide de plans. Une méthode d'enregistrement des plans est ajoutée au fichier d'entrée pour implémenter l'introduction et l'enregistrement.

    from flask import Blueprint
    login = Blueprint('login', __name__)
    @login.route('/login')
    def loginIndex():
        return "login Hello"
    Copier après la connexion

    Présentation du module Blueprint lorsque l'instance d'application est initialisée

    from flask import Flask
    def create_app():
        app = Flask(__name__)
        # 导入config中的配置文件
        app.config.from_object('app.config.setting')
        app.config.from_object('app.config.secure')
        # 注册并导入蓝图
        register_blue(app)
        return app
    def register_blue(app):
        from app.api.login import login
        app.register_blueprint(login)
    Copier après la connexion

    Optimisation du routeur

    Un chargeur peut être ajouté à chaque routeur lors de l'initialisation. chargez les plans dans Flask dans l'ordre, l'objectif d'optimisation du routeur a été atteint.

    class BaseRoutes:
        def __init__(self, name):
            self.name = name
            self.loader = []
        def route(self, rule, **options):
            def decorator(f):
                self.loader.append((f, rule, options))
                return f
            return decorator
        def register(self, bp, url_prefix=''):
            # 依次注册蓝图
            for f, rule, options in self.loader:
                endpoint = options.pop("endpoint", f.__name__)
                bp.add_url_rule(url_prefix + rule, endpoint, f, **options)
    Copier après la connexion

    Le code de chargement optimisé utilisé dans le fichier API est le suivant :

    from app.libs.BaseRoutes import BaseRoutes
    api = BaseRoutes('login')
    @api.route('/login/loginHandle', methods=['GET', 'POST'])
    def loginHandle():
        return "login Hello"
    Copier après la connexion

    SQLAlchemy

    Une fois le routage du web terminé, nous démarrer la base de données Pour plus de pratique et d'exploration, flask utilise SQLAlchemy pour faire fonctionner la base de données. Ici, nous prenons la base de données Mysql comme exemple.

    L'utilisation de SQLAlchemy nécessite l'installation de deux composants : base de données + package de pilotes. L'installation de Flask-SQLAlchemy + PyMySQL rendra notre développement plus simple et plus pratique.

    Définition de la classe de base de données

    Pour toutes les applications et plug-ins Flask, ils doivent être enregistrés dans l'application et utiliser des objets pour fonctionner. opérations , laissez les autres modules être enregistrés dans Base.

    Écrivez des méthodes publiques dans toutes les bases de données de Base pour réduire le processus de réinvention de la roue.

    Instancier SQLAlchemy dans Base

    from flask_sqlalchemy import SQLAlchemy
    db = SQLAlchemy()
    class Base(db.Model):
        # 忽略基类的主键
        __abstract__ = True
    Copier après la connexion

    Les classes de données ordinaires héritent de la classe Base, prenez la classe User comme exemple, introduisez le package db avant utilisation

    from app.models.base import Base
    class User(Base):
        __tablename__ = 'user'
        id = Column(Integer, primary_key=True, autoincrement=True)
        name = Column(String(50), nullable=False, default="")
        email = Column(String(120), nullable=False, default="")
        _password = Column('password',String(64))
        @property
        def password(self):
            return self._password
        @password.setter
        def password(self, raw):
            self._password = generate_password_hash(raw)
    Copier après la connexion
    #🎜 🎜#Entrée Chargement du fichier DB

    Lors du chargement des données, vous devez charger la configuration d'initialisation de la base de données, qui est spécifiée à l'aide de SQLALCHEMY_DATABASE_URI et a un format spécifié.

    SQLALCHEMY_DATABASE_URI = 'mysql+pymysql://root:123456@127.0.0.1:3306/admin?charset=utf8'
    Copier après la connexion
    SQLALCHEMY_DATABASE_URI指定,有指定的格式。

    def create_app():
        app = Flask(__name__)
        app.config.from_object('app.config.secure')
        # 初始化数据库
        db.init_app(app)
        with app.app_context():
            db.create_all()
        return app
    Copier après la connexion

    SQLALCHEMY_DATABASE_URI =数据库+驱动名称://用户名:密码@ip地址:端口号/数据库名称

    from sqlalchemy import Column, Integer, String, SmallInteger
    from app.models.base import Base, db
    class tp_manager(Base):
        STATUS_NORMAL = 1
        STATUS_STOP = 0
        # ...
        @classmethod
        def get_manager_by_name(cls, username):
            r = cls.query.filter(cls.username == username, cls.status == cls.STATUS_NORMAL).one()
            return r
        @classmethod
        def get_db(cls):
            r = db.session.query(cls).filter(cls.status == cls.STATUS_NORMAL).all()
            return r
    Copier après la connexion

    说明和解释一下with关键字的作用,在python中主要使用的是栈数据结构来运行App实例,with关键字能很好的区分上下文,当资源断开时会自动释放和回收,对程序能启到优化的作用。

    mysql的驱动可以使用cymysql,也可以使用pymysql,网上使用pymysql的教程会偏多一点,使用驱动时,如果拿不定主意去github上使用stat数多的插件,选大众型的,这样解决方案也会多一点。

    模块中定义方法

    model中可以定义模型,常量,直接操作数据库的原子方法,也可以使用db.session的形式来读取数据。

    from flask import request, session, jsonify
    from app.libs.BaseRoutes import BaseRoutes
    from app.validators.form.login import LoginForm
    from app.models.admin.tp_manager import tp_manager
    api = BaseRoutes('login')
    @api.route('/login/loginHandle', methods=['POST'])
    def loginHandle():
        form = LoginForm(request.form)
        if form.validate():
            # 验证通过的逻辑
            r = tp_manager.get_manager_by_name(form.username.data)
            if r:
                msg = '操作成功'
                session['manager_id'] = r.id
            else:
                msg = '账号和密码错误'
            return jsonify({"code": 200, "data": [], "msg": msg})
        else:
            # 错误暂时忽略...
            return form.errors
    Copier après la connexion

    在路由中的使用

    在路由中使用时,需要引入models中对应的model包,下面是一个简单使用的Demo,用户的权限可以使用falsk-login组件来存储用户信息。

    SECRET_KEY = '需要加密的key值'
    Copier après la connexion

    顺便写一句,flask在使用session前,在配置文件中需要配置SECRET_KEY,不然会报错,key值自定义即可。

    Column(Integer, index=True, nullable=False,  server_default="0",comment="昵称")
    Copier après la connexion

    SQLAlchemy实现mysql编码、列类型

    在SQLAlchemy 对Mysql实现了基本操作以后,我发现设置出来的默认值没有生效,字符集编码也被设置成了默认的latin1,优化Mysql的列类型,实现Mysql连接池、接入mongo、redis等NoSql数据库成了下一步要研究的问题。

    默认值和索引设置

    python源码包里的解释很清晰 还附带了例子 ,在Column中是这样设置的:

    from sqlalchemy.dialects.mysql import VARCHAR, TEXT, BIGINT, INTEGER, SMALLINT, TINYINT, DECIMAL, FLOAT, \
        DOUBLE, DATETIME, TIMESTAMP, DECIMAL
    Copier après la connexion

    server_default Orm设置初始化Mysql的值,unique指定的是否为唯一索引,default是在SQLAlchemy进行CURD操作时进行的默认值,server_defauldefault的值必须是字符串类型的。

    index是设置索引,nullable设置是否为空,comment设置的是备注信息。

    兼容Mysql列类型

    但是摆在眼前一个问题,你想使用tinyint类型,字符集怎么设置?

    from sqlalchemy import Column, Index, Integer
    from sqlalchemy.dialects.mysql import VARCHAR, TEXT, BIGINT, INTEGER, SMALLINT, TINYINT, DECIMAL, FLOAT, \
        DOUBLE, DATETIME, TIMESTAMP, DECIMAL
    from app.models.base import Base, db
    class wm_user_user(Base):
        STATUS_NORMAL = 1
        __tablename__ = 'wm_user_user'
        user_status = Column(TINYINT(display_width=1,unsigned=True), nullable=False, server_default="1",
                             comment="1为正常,0为审核中")
        user_nickname = Column(VARCHAR(length=50), index=True, nullable=False, comment="昵称")
        # 添加配置设置编码
        __table_args__ = {
            'mysql_charset': 'utf8mb4',
            'mysql_collate': 'utf8mb4_general_ci'
        }
    Copier après la connexion

    以使用最多的int和varchar为例,使用之前要导入对应的包:

    """Construct a TINYINT.
    :param display_width: Optional, maximum display width for this number.
    :param unsigned: a boolean, optional.
    :param zerofill: Optional. If true, values will be stored as strings
      left-padded with zeros. Note that this does not effect the values
      returned by the underlying database API, which continue to be
      numeric.
    """
    Copier après la connexion

    TINYINT类型中有三个参数:

    display_width 设置的是列类型宽度,设置完以后会显示tinyint(1)SQLALCHEMY_DATABASE_URI =Base de données + nom du pilote://nom d'utilisateur:mot de passe@adresse IP:numéro de port/nom de la base de données

    __tablename__ = 'wm_user_user'
    # ...
    __table_args__ = {
        'mysql_charset': 'utf8mb4',
        'mysql_collate': 'utf8mb4_general_ci'
    }
    Copier après la connexion
    Copier après la connexion

    Description et explication Allons jetez un œil au rôle du mot-clé with. En python, la structure de données de la pile est principalement utilisée pour exécuter des instances d'application. Le mot-clé with peut très bien distinguer le contexte. Lorsque les ressources sont déconnectées, elles seront automatiquement libérées et recyclées, ce qui peut. optimiser l'effet du programme.

    #🎜🎜#Le pilote MySQL peut utiliser cymysql ou pymysql. Il existe d'autres tutoriels sur l'utilisation de pymysql en ligne. Lorsque vous utilisez le pilote, si vous êtes indécis, allez sur github et utilisez un plug-in avec un grand nombre de statistiques. numéros. Choisissez le type populaire, il y aura donc plus de solutions. #🎜🎜##🎜🎜#Méthodes définies dans le module #🎜🎜##🎜🎜#model peut définir des modèles, des constantes, des méthodes atomiques qui font fonctionner directement la base de données, ou vous pouvez utiliser la forme de db.session< /code> pour lire les données. #🎜🎜#rrreee#🎜🎜#Utilisation dans le routage #🎜🎜##🎜🎜#Lorsqu'il est utilisé dans le routage, vous devez introduire le package de modèle correspondant dans les modèles. Ce qui suit est une démo simple qui peut être utilisée avec les autorisations utilisateur falsk. -composant de connexion pour stocker les informations utilisateur. #🎜🎜#rrreee#🎜🎜#Au fait, avant que flask n'utilise la session, vous devez configurer <code>SECRET_KEY dans le fichier de configuration, sinon une erreur sera signalée et la valeur de la clé pourra être personnalisée. #🎜🎜#rrreee#🎜🎜#SQLAlchemy implémente l'encodage MySQL et le type de colonne#🎜🎜##🎜🎜#Après que SQLAlchemy ait implémenté les opérations de base sur Mysql, j'ai constaté que la valeur par défaut définie ne prenait pas effet et que l'encodage du jeu de caractères était également défini Il est devenu le latin1 par défaut. L'optimisation du type de colonne de Mysql, la mise en œuvre du pool de connexions Mysql et l'accès aux bases de données NoSql telles que mongo et redis sont devenus des problèmes à étudier à l'étape suivante. #🎜🎜##🎜🎜#Valeur par défaut et paramètres d'index#🎜🎜##🎜🎜#L'explication dans le package de code source python est très claire et est accompagnée d'exemples. Dans Colonne, elle est définie comme. this:# 🎜🎜#rrreee#🎜🎜#server_default Orm définit la valeur pour initialiser Mysql Unique spécifie si c'est le seul index default est la valeur par défaut lorsque SQLAlchemy. effectue des opérations CURD, les valeurs de server_defaul et default doivent être de type chaîne. #🎜🎜##🎜🎜#index sert à définir l'index, nullable sert à définir s'il est vide et commentaire sert à définir les informations du commentaire. #🎜🎜##🎜🎜#Compatible avec le type de colonne Mysql#🎜🎜##🎜🎜#Mais il y a une question devant vous Si vous souhaitez utiliser le type tinyint, comment définir le jeu de caractères ? #🎜🎜#rrreee#🎜🎜# Prenons comme exemple les int et varchar les plus couramment utilisés. Avant de l'utiliser, vous devez importer le package correspondant : #🎜🎜#rrreee#🎜🎜#Il y a trois paramètres dans le type TINYINT : #🎜🎜##🎜🎜 #display_width définit la largeur du type de colonne. Après le réglage, tinyint(1) sera affiché si le deuxième non signé est une plage de valeurs positives, si le troisième remplissage à zéro est rempli, la valeur est de type numérique, voici les instructions d'utilisation du code source de TINYINT. #🎜🎜#rrreee#🎜🎜# Permettez-moi de présenter brièvement le type de chaîne avec varchar comme code. Le type de chaîne doit déclarer explicitement la longueur de la chaîne, qui est implémentée par length. Si la valeur de length n'est pas ajoutée, une erreur sera générée. se produisent lors de l’initialisation. #🎜🎜#

    自定义数据库名和字符集编码

    __tablename__设置的是自定义数据表名,底下的设置的是数据表字符集编码,要使用utf8mb4编码和utf8mb4_general_ci编码,这里就不做过多的解释了。

    __tablename__ = &#39;wm_user_user&#39;
    # ...
    __table_args__ = {
        &#39;mysql_charset&#39;: &#39;utf8mb4&#39;,
        &#39;mysql_collate&#39;: &#39;utf8mb4_general_ci&#39;
    }
    Copier après la connexion
    Copier après la connexion

    Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

    Déclaration de ce site Web
    Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn

    Outils d'IA chauds

    Undresser.AI Undress

    Undresser.AI Undress

    Application basée sur l'IA pour créer des photos de nu réalistes

    AI Clothes Remover

    AI Clothes Remover

    Outil d'IA en ligne pour supprimer les vêtements des photos.

    Undress AI Tool

    Undress AI Tool

    Images de déshabillage gratuites

    Clothoff.io

    Clothoff.io

    Dissolvant de vêtements AI

    AI Hentai Generator

    AI Hentai Generator

    Générez AI Hentai gratuitement.

    Article chaud

    R.E.P.O. Crystals d'énergie expliqués et ce qu'ils font (cristal jaune)
    2 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
    Repo: Comment relancer ses coéquipiers
    1 Il y a quelques mois By 尊渡假赌尊渡假赌尊渡假赌
    Hello Kitty Island Adventure: Comment obtenir des graines géantes
    4 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
    Combien de temps faut-il pour battre Split Fiction?
    3 Il y a quelques semaines By DDD

    Outils chauds

    Bloc-notes++7.3.1

    Bloc-notes++7.3.1

    Éditeur de code facile à utiliser et gratuit

    SublimeText3 version chinoise

    SublimeText3 version chinoise

    Version chinoise, très simple à utiliser

    Envoyer Studio 13.0.1

    Envoyer Studio 13.0.1

    Puissant environnement de développement intégré PHP

    Dreamweaver CS6

    Dreamweaver CS6

    Outils de développement Web visuel

    SublimeText3 version Mac

    SublimeText3 version Mac

    Logiciel d'édition de code au niveau de Dieu (SublimeText3)

    Comment ouvrir le format XML Comment ouvrir le format XML Apr 02, 2025 pm 09:00 PM

    Utiliser la plupart des éditeurs de texte pour ouvrir des fichiers XML; Si vous avez besoin d'un affichage d'arbre plus intuitif, vous pouvez utiliser un éditeur XML, tel que Oxygen XML Editor ou XMLSPY; Si vous traitez les données XML dans un programme, vous devez utiliser un langage de programmation (tel que Python) et des bibliothèques XML (telles que XML.ETREE.ElementTree) pour analyser.

    Y a-t-il une application mobile qui peut convertir XML en PDF? Y a-t-il une application mobile qui peut convertir XML en PDF? Apr 02, 2025 pm 08:54 PM

    Une application qui convertit le XML directement en PDF ne peut être trouvée car ce sont deux formats fondamentalement différents. XML est utilisé pour stocker des données, tandis que PDF est utilisé pour afficher des documents. Pour terminer la transformation, vous pouvez utiliser des langages de programmation et des bibliothèques telles que Python et ReportLab pour analyser les données XML et générer des documents PDF.

    La vitesse de conversion est-elle rapide lors de la conversion du XML en PDF sur le téléphone mobile? La vitesse de conversion est-elle rapide lors de la conversion du XML en PDF sur le téléphone mobile? Apr 02, 2025 pm 10:09 PM

    La vitesse du XML mobile à PDF dépend des facteurs suivants: la complexité de la structure XML. Méthode de conversion de configuration du matériel mobile (bibliothèque, algorithme) Méthodes d'optimisation de la qualité du code (sélectionnez des bibliothèques efficaces, optimiser les algorithmes, les données de cache et utiliser le multi-threading). Dans l'ensemble, il n'y a pas de réponse absolue et elle doit être optimisée en fonction de la situation spécifique.

    Comment modifier le contenu des commentaires dans XML Comment modifier le contenu des commentaires dans XML Apr 02, 2025 pm 06:15 PM

    Pour les petits fichiers XML, vous pouvez remplacer directement le contenu d'annotation par un éditeur de texte; Pour les fichiers volumineux, il est recommandé d'utiliser l'analyseur XML pour le modifier pour garantir l'efficacité et la précision. Soyez prudent lors de la suppression des commentaires XML, le maintien des commentaires aide généralement à coder la compréhension et la maintenance. Les conseils avancés fournissent un exemple de code Python pour modifier les commentaires à l'aide de l'analyseur XML, mais l'implémentation spécifique doit être ajustée en fonction de la bibliothèque XML utilisée. Faites attention aux problèmes d'encodage lors de la modification des fichiers XML. Il est recommandé d'utiliser le codage UTF-8 et de spécifier le format de codage.

    Outil de mise en forme XML recommandé Outil de mise en forme XML recommandé Apr 02, 2025 pm 09:03 PM

    Les outils de mise en forme XML peuvent taper le code en fonction des règles pour améliorer la lisibilité et la compréhension. Lors de la sélection d'un outil, faites attention aux capacités de personnalisation, en gérant des circonstances spéciales, des performances et de la facilité d'utilisation. Les types d'outils couramment utilisés incluent des outils en ligne, des plug-ins IDE et des outils de ligne de commande.

    Existe-t-il un outil gratuit XML à PDF pour les téléphones mobiles? Existe-t-il un outil gratuit XML à PDF pour les téléphones mobiles? Apr 02, 2025 pm 09:12 PM

    Il n'y a pas d'outil XML à PDF simple et direct sur mobile. Le processus de visualisation des données requis implique une compréhension et un rendu complexes des données, et la plupart des outils dits "gratuits" sur le marché ont une mauvaise expérience. Il est recommandé d'utiliser des outils côté informatique ou d'utiliser des services cloud, ou de développer vous-même des applications pour obtenir des effets de conversion plus fiables.

    Comment convertir XML en PDF sur votre téléphone avec une qualité de haute qualité? Comment convertir XML en PDF sur votre téléphone avec une qualité de haute qualité? Apr 02, 2025 pm 09:48 PM

    Convertir XML en PDF avec une qualité de haute qualité sur votre téléphone mobile nécessite: analyser le XML dans le cloud et générer des PDF à l'aide d'une plate-forme informatique sans serveur. Choisissez un analyseur XML efficace et une bibliothèque de génération PDF. Gérer correctement les erreurs. Faites une utilisation complète de la puissance de cloud computing pour éviter les tâches lourdes sur votre téléphone. Ajustez la complexité en fonction des exigences, notamment le traitement des structures XML complexes, la génération de PDF de plusieurs pages et l'ajout d'images. Imprimez les informations du journal pour aider à déboguer. Optimiser les performances, sélectionner des analyseurs efficaces et des bibliothèques PDF et peut utiliser une programmation asynchrone ou des données XML prétraitées. Assurez-vous une bonne qualité de code et maintenabilité.

    Comment convertir les fichiers XML en PDF sur votre téléphone? Comment convertir les fichiers XML en PDF sur votre téléphone? Apr 02, 2025 pm 10:12 PM

    Il est impossible de terminer la conversion XML à PDF directement sur votre téléphone avec une seule application. Il est nécessaire d'utiliser les services cloud, qui peuvent être réalisés via deux étapes: 1. Convertir XML en PDF dans le cloud, 2. Accédez ou téléchargez le fichier PDF converti sur le téléphone mobile.

    See all articles