zoukankan      html  css  js  c++  java
  • Flask项目中整合各组件

    一、介绍

    主要介绍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
  • 相关阅读:
    开源搜索引擎Solr的快速搭建及集成到企业门户最佳实施方案--转载
    Java开发WebService的几种方法--转载
    HBase Java简单示例--转载
    Eclipse快捷键大全--转载
    Java中List、Set和Map的区别--转载
    ArrayList和Iterator的用法
    日期格式化
    java中的值传递和引用传递问题
    Servlet,过滤器,监听器,拦截器的区别
    Java过滤器与SpringMVC拦截器之间的关系与区别
  • 原文地址:https://www.cnblogs.com/believepd/p/10381420.html
Copyright © 2011-2022 走看看