搜尋
首頁後端開發Python教學如何使用Flask Blueprint和SQLAlchemy編寫Python應用程式

    安裝準備

    python3 -V && pip3 -V
    pip3 install pipenv

    pipenv

    pipenv shell

    PyCharm的環境配置在這裡就不做過多解釋了,這裡針對後續的代碼進行講解。

    開始實踐

    Flask 原理是在App初始化時,將藍圖和App進行綁定來實現Web路由功能,路由的實作是所有專案中的第一步。

    入口文件

    在專案開始之前,定義一個入口文件,讓請求實例化App,入口文件需要做的是初始化設定檔、引入控制器、初始化資料庫等操作。

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

    在啟動檔中進行調用,啟動檔中需要加入判斷,原因後續再解釋。

    from app.app import create_app
    app = create_app()
    if __name__ == '__main__':
        app.run(debug =True,port=81,host= '0.0.0.0')

    路由

    Flask是用藍圖實現的路由功能,在入口檔案中新增註冊藍圖的方法,實作引入和註冊。

    from flask import Blueprint
    login = Blueprint('login', __name__)
    @login.route('/login')
    def loginIndex():
        return "login Hello"

    在app實例初始化時,引入藍圖模組

    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)

    優化路由器

    在每個路由器中可以新增一個裝載器,在初始化來依序載入Flask中的藍圖,已到達優化路由器的目的。

    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)

    api檔案中使用最佳化後的裝載器程式碼如下:

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

    SQLAlchemy

    對web的路由完成後,我們開始對資料庫的增刪改查進行進一步的實踐與探索,flask使用SQLAlchemy進行資料庫的操作,這裡我們以Mysql資料庫為例。

    使用SQLAlchemy需要安裝資料庫 驅動包兩個元件,安裝 Flask-SQLAlchemy PyMySQL 兩個元件,會讓我們的開發變的更加簡潔和方便。

    database類別的定義

    對於Flask的所有應用程式和插件而言,都需要註冊在App實力中,使用物件進行操作,先定義資料庫操作的基類,讓其他的模組註冊在Base。

    Base中寫入所有DB中的公共方法,以減少重複造輪子的過程。

    Base 中實例化SQLAlchemy

    from flask_sqlalchemy import SQLAlchemy
    db = SQLAlchemy()
    class Base(db.Model):
        # 忽略基类的主键
        __abstract__ = True

    普通資料類繼承Base類,以User類為例,使用之前引入db包

    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)

    入口檔載入DB

    #在載入資料時需要載入資料庫初始化的配置,使用SQLALCHEMY_DATABASE_URI指定,有指定的格式。

    SQLALCHEMY_DATABASE_URI = 'mysql+pymysql://root:123456@127.0.0.1:3306/admin?charset=utf8'

    SQLALCHEMY_DATABASE_URI =資料庫驅動程式名稱://使用者名稱:密碼@ip位址:連接埠號碼/資料庫名稱

    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

    說明並解釋一下with關鍵字的作用,在python中主要使用的是棧資料結構來運行App實例,with關鍵字能很好的區分上下文,當資源斷開時會自動釋放和回收,對程式能啟動到最佳化的作用。

    mysql的驅動可以使用cymysql,也可以使用pymysql,網上使用pymysql的教程會偏多一點,使用驅動時,如果拿不定主意去github上使用stat數多的插件,選大眾型的,這樣解決方案也會多一點。

    模組中定義方法

    model中可以定義模型,常數,直接操作資料庫的原子方法,也可以使用db.session的形式來讀取資料。

    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

    在路由中的使用

    在路由中使用時,需要引入models中對應的model包,下面是一個簡單使用的Demo,用戶的權限可以使用falsk-login元件來儲存用戶資訊。

    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

    順便寫一句,flask在使用session前,在設定檔中需要設定SECRET_KEY,不然會報錯,key值自訂即可。

    SECRET_KEY = '需要加密的key值'

    SQLAlchemy實作mysql編碼、列類型

    在SQLAlchemy 對Mysql實現了基本操作以後,我發現設定出來的預設值沒有生效,字元集編碼也被設定成了預設的latin1,最佳化Mysql的欄位類型,實作Mysql連線池、存取mongo、redis等NoSql資料庫成了下一步要研究的問題。

    預設值和索引設定

    python原始碼包裡的解釋很清楚也附帶了例子,在Column中是這樣設定的:

    Column(Integer, index=True, nullable=False,  server_default="0",comment="昵称")

    server_default Orm設定初始化Mysql的值,unique指定的是否為唯一索引,default是在SQLAlchemy進行CURD操作時進行的預設值,server_defauldefault的值必須是字串類型的。

    index是設定索引,nullable設定是否為空,comment設定的是備註資訊。

    相容Mysql列類型

    但擺在眼前一個問題,你想使用tinyint類型,字元集怎麼設定?

    from sqlalchemy.dialects.mysql import VARCHAR, TEXT, BIGINT, INTEGER, SMALLINT, TINYINT, DECIMAL, FLOAT, \
        DOUBLE, DATETIME, TIMESTAMP, DECIMAL

    以使用最多的int和varchar為例,使用之前要導入對應的套件:

    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'
        }

    TINYINT類型中有三個參數:

    display_width 設定的是列類型寬度,設定完以後會顯示tinyint(1),第二個unsigned 是否是取正值的取值範圍,第三個zerofill是否填充,值是一個數字型別,下面是TINYINT的原始碼使用說明。

    """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.
    """

    簡單在介紹一下,以varchar為代碼的字串類型,字串類型是必須顯示宣告字串長度,用length實現,不加入length的值在初始化會發生錯誤。

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

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

    __tablename__ = 'wm_user_user'
    # ...
    __table_args__ = {
        'mysql_charset': 'utf8mb4',
        'mysql_collate': 'utf8mb4_general_ci'
    }

    以上是如何使用Flask Blueprint和SQLAlchemy編寫Python應用程式的詳細內容。更多資訊請關注PHP中文網其他相關文章!

    陳述
    本文轉載於:亿速云。如有侵權,請聯絡admin@php.cn刪除
    详细讲解Python之Seaborn(数据可视化)详细讲解Python之Seaborn(数据可视化)Apr 21, 2022 pm 06:08 PM

    本篇文章给大家带来了关于Python的相关知识,其中主要介绍了关于Seaborn的相关问题,包括了数据可视化处理的散点图、折线图、条形图等等内容,下面一起来看一下,希望对大家有帮助。

    详细了解Python进程池与进程锁详细了解Python进程池与进程锁May 10, 2022 pm 06:11 PM

    本篇文章给大家带来了关于Python的相关知识,其中主要介绍了关于进程池与进程锁的相关问题,包括进程池的创建模块,进程池函数等等内容,下面一起来看一下,希望对大家有帮助。

    Python自动化实践之筛选简历Python自动化实践之筛选简历Jun 07, 2022 pm 06:59 PM

    本篇文章给大家带来了关于Python的相关知识,其中主要介绍了关于简历筛选的相关问题,包括了定义 ReadDoc 类用以读取 word 文件以及定义 search_word 函数用以筛选的相关内容,下面一起来看一下,希望对大家有帮助。

    归纳总结Python标准库归纳总结Python标准库May 03, 2022 am 09:00 AM

    本篇文章给大家带来了关于Python的相关知识,其中主要介绍了关于标准库总结的相关问题,下面一起来看一下,希望对大家有帮助。

    Python数据类型详解之字符串、数字Python数据类型详解之字符串、数字Apr 27, 2022 pm 07:27 PM

    本篇文章给大家带来了关于Python的相关知识,其中主要介绍了关于数据类型之字符串、数字的相关问题,下面一起来看一下,希望对大家有帮助。

    分享10款高效的VSCode插件,总有一款能够惊艳到你!!分享10款高效的VSCode插件,总有一款能够惊艳到你!!Mar 09, 2021 am 10:15 AM

    VS Code的确是一款非常热门、有强大用户基础的一款开发工具。本文给大家介绍一下10款高效、好用的插件,能够让原本单薄的VS Code如虎添翼,开发效率顿时提升到一个新的阶段。

    详细介绍python的numpy模块详细介绍python的numpy模块May 19, 2022 am 11:43 AM

    本篇文章给大家带来了关于Python的相关知识,其中主要介绍了关于numpy模块的相关问题,Numpy是Numerical Python extensions的缩写,字面意思是Python数值计算扩展,下面一起来看一下,希望对大家有帮助。

    python中文是什么意思python中文是什么意思Jun 24, 2019 pm 02:22 PM

    pythn的中文意思是巨蟒、蟒蛇。1989年圣诞节期间,Guido van Rossum在家闲的没事干,为了跟朋友庆祝圣诞节,决定发明一种全新的脚本语言。他很喜欢一个肥皂剧叫Monty Python,所以便把这门语言叫做python。

    See all articles

    熱AI工具

    Undresser.AI Undress

    Undresser.AI Undress

    人工智慧驅動的應用程序,用於創建逼真的裸體照片

    AI Clothes Remover

    AI Clothes Remover

    用於從照片中去除衣服的線上人工智慧工具。

    Undress AI Tool

    Undress AI Tool

    免費脫衣圖片

    Clothoff.io

    Clothoff.io

    AI脫衣器

    AI Hentai Generator

    AI Hentai Generator

    免費產生 AI 無盡。

    熱門文章

    R.E.P.O.能量晶體解釋及其做什麼(黃色晶體)
    3 週前By尊渡假赌尊渡假赌尊渡假赌
    R.E.P.O.最佳圖形設置
    3 週前By尊渡假赌尊渡假赌尊渡假赌
    R.E.P.O.如果您聽不到任何人,如何修復音頻
    3 週前By尊渡假赌尊渡假赌尊渡假赌

    熱工具

    SecLists

    SecLists

    SecLists是最終安全測試人員的伙伴。它是一個包含各種類型清單的集合,這些清單在安全評估過程中經常使用,而且都在一個地方。 SecLists透過方便地提供安全測試人員可能需要的所有列表,幫助提高安全測試的效率和生產力。清單類型包括使用者名稱、密碼、URL、模糊測試有效載荷、敏感資料模式、Web shell等等。測試人員只需將此儲存庫拉到新的測試機上,他就可以存取所需的每種類型的清單。

    EditPlus 中文破解版

    EditPlus 中文破解版

    體積小,語法高亮,不支援程式碼提示功能

    SAP NetWeaver Server Adapter for Eclipse

    SAP NetWeaver Server Adapter for Eclipse

    將Eclipse與SAP NetWeaver應用伺服器整合。

    Atom編輯器mac版下載

    Atom編輯器mac版下載

    最受歡迎的的開源編輯器

    PhpStorm Mac 版本

    PhpStorm Mac 版本

    最新(2018.2.1 )專業的PHP整合開發工具