1. 程式人生 > >Flask整合各組件項目以及pipreqs的作用

Flask整合各組件項目以及pipreqs的作用

image run key oot stat 唯一索引 param 使用命令 你知道

一、介紹

主要介紹flask_sqlalchemy、flask_script、flask_migrate這三個組件該如何整合到flask項目中,以及如何使用。

# 安裝組件
    pip3 install flask_sqlalchemy
    pip3 install flask_script
    pip3 install flask_migrate

# flask_sqlalchemy:
    將Flask和SQLAlchemy很好的結合在一起
# flask_script:
    用於生成命令,在項目根目錄路徑下使用命令
    例如:python manage.py runserver
# flask_migrate 用來實現數據庫遷移(依賴flask-script)

二、項目結構

所有的操作說明在代碼註釋中;下圖,migrations是數據庫遷移時生成的(不必理會),create_table.py是在還沒有使用flask-migrate組件時用來在數據庫中創建表的(不必理會),requirements.txt後續會有說明。

技術分享圖片

index.py:介紹了在視圖函數中如何進行數據庫操作

技術分享圖片
from flask import Blueprint
from pro_flask import db
from pro_flask import models

idx 
= Blueprint("index", __name__) @idx.route("/index") def index(): # 使用SQLAlchemy在數據庫插入一條數據 """ db.session.add_all([ models.UserInfo(name="佩奇"), models.UserInfo(name="喬治") ]) db.session.commit() db.session.remove() """ # 查詢 ret = db.session.query(models.UserInfo).all()
print(ret) db.session.remove() return "Index"
View Code

__init__.py

技術分享圖片
from flask import Flask
from flask_session import Session
from flask_sqlalchemy import SQLAlchemy

db = SQLAlchemy()  # 把以後用到的所有數據庫相關的東西封裝在此(實例化必須在導入藍圖上面)
"""
flask_sqlalchemy使用步驟:
    1、導入並實例化SQLAlchemy
    2、在models.py中導入db,類繼承db.Model
    3、在create_app函數中使用db.init_app(app),可以理解為去app中讀取配置文件
"""

from pro_flask.views.index import idx
from pro_flask.views.account import account
from pro_flask.models import *


def create_app():
    app = Flask(__name__, template_folder="templates", static_folder="statics", static_url_path="/static")
    app.config.from_object("settings.BaseConfig")
    app.register_blueprint(idx)
    app.register_blueprint(account)
    # Session(app)
    db.init_app(app)  # 依賴app中的配置文件
    return app
View Code

models.py:相當於Django中的models.py作用

技術分享圖片
from sqlalchemy import Column
from sqlalchemy import Integer, String, UniqueConstraint, Index
from . import db


class UserInfo(db.Model):
    __tablename__ = "userinfo"

    id = Column(Integer, primary_key=True)
    name = Column(String(16), index=True, unique=True, nullable=False)

    __table_args__ = (
        # UniqueConstraint("id", "name", name="unic_id_name"),  # 聯合唯一索引
        # Index("idx_age_birthday", "age", "birthday"),  # 聯合索引
    )
View Code

create_table.py:可以讓你知道是如何在數據庫中創建表的

技術分享圖片
from pro_flask import db, create_app

app = create_app()
app_ctx = app.app_context()  # app_ctx = app/g
with app_ctx:                # __enter__,通過LocalStack放入Local中
    db.create_all()          # 調用LocalStack放入Local中獲取app,再去app中獲取配置

"""
右鍵執行即可在數據庫中創建表;
但是不用這種操作,可以使用flask-migrate組件實現數據庫遷移;
具體使用方式,請看manage.py
"""
View Code

manage.py:程序啟動文件

技術分享圖片
from pro_flask import db
from pro_flask import create_app
from flask_script import Manager
from flask_migrate import Migrate, MigrateCommand

app = create_app()
manager = Manager(app)
Migrate(app, db)
manager.add_command("db", MigrateCommand)  # 新增一個叫做"db"的命令
"""
數據庫遷移命令:
    python manage.py db init     # 只執行第一次就行了,表結構修改後,執行下面兩個命令就可以了
    python manage.py db migrate  # 相當於Django中的makemigrations
    python manage.py db upgrade  # 相當於Django中的migrate
"""

# @manager.command
# def custom(arg):
#     """
#     按照位置傳參自定義命令
#     python manage.py custom 123
#     :param arg:
#     :return:
#     """
#     print(arg)  # 123
#
# @manager.option("-n", "--name", dest="name")
# @manager.option("-u", "--url", dest="url")
# def cmd(name, url):
#     """
#     按照關鍵字傳參自定義命令
#     python manage.py cmd -n pd -u https://www.baidu.com
#     :param name:
#     :param url:
#     :return:
#     """
#     print(name, url)

if __name__ == "__main__":
    # app.run()  # 有了manager就可以寫成下面這種格式了
    manager.run()

    # 啟動命令(在項目根目錄下執行命令)
    """
    python manage.py runserver
    python manage.py runserver -h 127.0.0.1 -p 8080
    """
View Code

settings.py:如果使用DBUtils,也可以放在配置文件中

技術分享圖片
import redis


class BaseConfig(object):
    # flask-session配置
    # SESSION_TYPE = "redis"
    # SESSION_REDIS = redis.Redis(host="127.0.0.1",port=6379)

    # 使用Flask-SQAlchemy需要做以下配置
    SQLALCHEMY_DATABASE_URI = "mysql+pymysql://root:""@127.0.0.1:3306/test_db?charset=utf8"
    SQLALCHEMY_POOL_SIZE = 10     # 連接池大小
    SQLALCHEMY_MAX_OVERFLOW = 5   # 在連接池達到最大值後可以創建的連接數;當這些額外的連接回收到連接池後將會被斷開和拋棄。
    SQLALCHEMY_POOL_TIMEOUT = 20  # 池中沒有連接最多等待的時間,否則報錯
    SQLALCHEMY_TRACK_MODIFICATIONS = False


class ProductConfig(BaseConfig):
    pass
View Code

1

Flask整合各組件項目以及pipreqs的作用