目錄
安裝準備
pipenv
開始實踐
入口文件
路由
優化路由器
SQLAlchemy
database類別的定義
入口檔載入DB
模組中定義方法
在路由中的使用
SQLAlchemy實作mysql編碼、列類型
預設值和索引設定
相容Mysql列類型
自定义数据库名和字符集编码
首頁 後端開發 Python教學 如何使用Flask Blueprint和SQLAlchemy編寫Python應用程式

如何使用Flask Blueprint和SQLAlchemy編寫Python應用程式

May 06, 2023 pm 07:28 PM
python sqlalchemy

    安裝準備

    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

    熱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 尊渡假赌尊渡假赌尊渡假赌
    WWE 2K25:如何解鎖Myrise中的所有內容
    4 週前 By 尊渡假赌尊渡假赌尊渡假赌

    熱工具

    記事本++7.3.1

    記事本++7.3.1

    好用且免費的程式碼編輯器

    SublimeText3漢化版

    SublimeText3漢化版

    中文版,非常好用

    禪工作室 13.0.1

    禪工作室 13.0.1

    強大的PHP整合開發環境

    Dreamweaver CS6

    Dreamweaver CS6

    視覺化網頁開發工具

    SublimeText3 Mac版

    SublimeText3 Mac版

    神級程式碼編輯軟體(SublimeText3)

    mysql 是否要付費 mysql 是否要付費 Apr 08, 2025 pm 05:36 PM

    MySQL 有免費的社區版和收費的企業版。社區版可免費使用和修改,但支持有限,適合穩定性要求不高、技術能力強的應用。企業版提供全面商業支持,適合需要穩定可靠、高性能數據庫且願意為支持買單的應用。選擇版本時考慮的因素包括應用關鍵性、預算和技術技能。沒有完美的選項,只有最合適的方案,需根據具體情況謹慎選擇。

    mysql安裝後怎麼使用 mysql安裝後怎麼使用 Apr 08, 2025 am 11:48 AM

    文章介紹了MySQL數據庫的上手操作。首先,需安裝MySQL客戶端,如MySQLWorkbench或命令行客戶端。 1.使用mysql-uroot-p命令連接服務器,並使用root賬戶密碼登錄;2.使用CREATEDATABASE創建數據庫,USE選擇數據庫;3.使用CREATETABLE創建表,定義字段及數據類型;4.使用INSERTINTO插入數據,SELECT查詢數據,UPDATE更新數據,DELETE刪除數據。熟練掌握這些步驟,並學習處理常見問題和優化數據庫性能,才能高效使用MySQL。

    如何針對高負載應用程序優化 MySQL 性能? 如何針對高負載應用程序優化 MySQL 性能? Apr 08, 2025 pm 06:03 PM

    MySQL數據庫性能優化指南在資源密集型應用中,MySQL數據庫扮演著至關重要的角色,負責管理海量事務。然而,隨著應用規模的擴大,數據庫性能瓶頸往往成為製約因素。本文將探討一系列行之有效的MySQL性能優化策略,確保您的應用在高負載下依然保持高效響應。我們將結合實際案例,深入講解索引、查詢優化、數據庫設計以及緩存等關鍵技術。 1.數據庫架構設計優化合理的數據庫架構是MySQL性能優化的基石。以下是一些核心原則:選擇合適的數據類型選擇最小的、符合需求的數據類型,既能節省存儲空間,又能提升數據處理速度

    HadiDB:Python 中的輕量級、可水平擴展的數據庫 HadiDB:Python 中的輕量級、可水平擴展的數據庫 Apr 08, 2025 pm 06:12 PM

    HadiDB:輕量級、高水平可擴展的Python數據庫HadiDB(hadidb)是一個用Python編寫的輕量級數據庫,具備高度水平的可擴展性。安裝HadiDB使用pip安裝:pipinstallhadidb用戶管理創建用戶:createuser()方法創建一個新用戶。 authentication()方法驗證用戶身份。 fromhadidb.operationimportuseruser_obj=user("admin","admin")user_obj.

    Navicat查看MongoDB數據庫密碼的方法 Navicat查看MongoDB數據庫密碼的方法 Apr 08, 2025 pm 09:39 PM

    直接通過 Navicat 查看 MongoDB 密碼是不可能的,因為它以哈希值形式存儲。取回丟失密碼的方法:1. 重置密碼;2. 檢查配置文件(可能包含哈希值);3. 檢查代碼(可能硬編碼密碼)。

    mysql 需要互聯網嗎 mysql 需要互聯網嗎 Apr 08, 2025 pm 02:18 PM

    MySQL 可在無需網絡連接的情況下運行,進行基本的數據存儲和管理。但是,對於與其他系統交互、遠程訪問或使用高級功能(如復制和集群)的情況,則需要網絡連接。此外,安全措施(如防火牆)、性能優化(選擇合適的網絡連接)和數據備份對於連接到互聯網的 MySQL 數據庫至關重要。

    mysql workbench 可以連接到 mariadb 嗎 mysql workbench 可以連接到 mariadb 嗎 Apr 08, 2025 pm 02:33 PM

    MySQL Workbench 可以連接 MariaDB,前提是配置正確。首先選擇 "MariaDB" 作為連接器類型。在連接配置中,正確設置 HOST、PORT、USER、PASSWORD 和 DATABASE。測試連接時,檢查 MariaDB 服務是否啟動,用戶名和密碼是否正確,端口號是否正確,防火牆是否允許連接,以及數據庫是否存在。高級用法中,使用連接池技術優化性能。常見錯誤包括權限不足、網絡連接問題等,調試錯誤時仔細分析錯誤信息和使用調試工具。優化網絡配置可以提升性能

    mysql 需要服務器嗎 mysql 需要服務器嗎 Apr 08, 2025 pm 02:12 PM

    對於生產環境,通常需要一台服務器來運行 MySQL,原因包括性能、可靠性、安全性和可擴展性。服務器通常擁有更強大的硬件、冗餘配置和更嚴格的安全措施。對於小型、低負載應用,可在本地機器運行 MySQL,但需謹慎考慮資源消耗、安全風險和維護成本。如需更高的可靠性和安全性,應將 MySQL 部署到雲服務器或其他服務器上。選擇合適的服務器配置需要根據應用負載和數據量進行評估。

    See all articles