zoukankan      html  css  js  c++  java
  • Flask蓝图目录、Flask-SQLAlchemy、Flask-Script、Flask-Migrate

    一、Flask蓝图目录

      我们之前写的Flask项目都是自己组织的目录结构,其实Flask官方有其推荐的目录结构,以下就是一个符合官方推荐的Flask小型应用的项目结构目录示例,如下:

      如图,这就是我们建立好的一个目录结构,一层一层的看一下,首先是app目录,它就是我们的主应用程序目录了,其中有一个__init__.py文件,里面的内容如下:

    from flask import Flask
    from .views.acc import acc_bp
    from .views.user import user_bp
    
    def create_app():
        my_app = Flask(__name__)
        my_app.register_blueprint(acc_bp)
        my_app.register_blueprint(user_bp)
    
        return my_app
    app/__init__.py  

      __init__.py就是构建app的一个函数,并且将views中的蓝图注册进去了。

      接下来看static目录,这个目录从字面意思就可以理解了,是我们的static静态文件存放目录。

      然后就是templates目录,即模板存放目录。

      views目录,主角终于登场了,这里存放的就是视图函数文件,也就是我们Blueprint,每一个文件就是一个Blueprint,如下:

    from flask import Blueprint
    
    acc_bp = Blueprint('acc', __name__)
    
    @acc_bp.route("/acc")
    def accfunc():
        return "my_app.acc"
    views/acc.py
    from flask import Blueprint
    
    user_bp = Blueprint('user', __name__)
    
    @user_bp.route("/login")
    def user_login():
        return "my_app.user"
    views/user.py

      接下来就是关键性的一个文件manager.py,项目的启动文件,内容如下:

    from app import create_app
    
    my_app = create_app()
    
    if __name__ == '__main__':
        my_app.run()
    manager.py

    二、Flask-SQLAlchemy 

    1、安装 

    pip install Flask-SQLAlchemy

    2、接下来基于上面的Flask项目,我们要加入Flask-SQLAlchemy让项目变得生动起来

      2.1、加入Flask-SQLAlchemy第三方组件

    from flask import Flask
    from flask_sqlalchemy import SQLAlchemy    # 导入Flask-SQLAlchemy中的SQLAlchemy
    
    db = SQLAlchemy()   # 实例化SQLAlchemy
    # 注意:实例化SQLAlchemy的代码必须要在引入蓝图之前
    
    # 引入蓝图
    from .views.acc import acc_bp
    from .views.user import user_bp
    
    
    def create_app():
        my_app = Flask(__name__)
    
        # 初始化app配置,专门针对SQLAlchemy 进行配置
        my_app.config["SQLALCHEMY_DATABASE_URI"] = "mysql+pymysql://root:@127.0.0.1:3306/wll?charset=utf8"
        my_app.config["SQLALCHEMY_POOL_SIZE"] = 5    # SQLAlchemy的连接池大小
        my_app.config["SQLALCHEMY_POOL_TIMEOUT"] = 15   # SQLAlchemy的连接超时时间
        my_app.config["SQLALCHEMY_TRACK_MODIFICATIONS"] = False
    
        db.init_app(my_app)  # 初始化SQLAlchemy , 本质就是将以上的配置读取出来
    
        my_app.register_blueprint(acc_bp)
        my_app.register_blueprint(user_bp)
    
        return my_app
    app/__init__.py

      2.2、在app目录下建立models.py(ORM模型文件)

    from app import db
    
    # from sqlalchemy.ext.declarative import declarative_base
    # Base = declarative_base()
    # 之前我们在创建数据表的时候都要做这样一件事,然而Flask-SQLAlchemy已经为我们把 Base 封装好了,即db.Model
    
    # 建立users数据表
    class Users(db.Model):
        __tablename__ = 'users'
        # __table_args__ = {"useexisting": True}
    
        # Flask-SQLAlchemy 也为我们封装好了Column,Integer,String等
        id = db.Column(db.Integer, primary_key=True)
        name = db.Column(db.String(32))
        password = db.Column(db.String(32))
    
    
    if __name__ == '__main__':
        from app import create_app
        my_app = create_app()
        # 这里你要回顾一下Flask应用上下文管理了
        # 离线脚本:
        with my_app.app_context():
            db.drop_all()        # 删除所有表
            db.create_all()      # 创建表
    app/models.py

      2.3、登录视图函数

    from flask import Blueprint, request, render_template
    
    user_bp = Blueprint('user', __name__)
    
    from app.models import Users
    from app import db
    
    
    @user_bp.route("/login", methods=['GET', 'POST'])
    def user_login():
        if request.method == 'POST':
            username = request.form.get('username')
            password = request.form.get('password')
    
            # 还记不记得我们在sqlalchemy中手动打开会话 db_session
            # from sqlalchemy.orm import sessionmaker
            # Session = sessionmaker(engine)
            # db_session = Session()
            # 现在不用了,因为 Flask-SQLAlchemy 也已经为我们做好会话打开的工作
            db.session.add(Users(name=username,password=password))
            db.session.commit()
    
            # 查询
            user_obj = Users.query.filter(Users.name == username and Users.password == password).first()
            if user_obj:
                return f"{user_obj.name}登录成功"
    
        return render_template("login.html")
    views/user.py

      2.4、登陆页面

    <!DOCTYPE html>
    <html lang="en">
    <head>
      <meta charset="UTF-8">
      <title>Title</title>
    </head>
    <body>
    <form method="post" action="">
      <input type="text" name="username">
      <input type="password" name="password">
      <input type="submit">
    </form>
    </body>
    </html>
    templates/login.html

    三、Flask-Script

    1、安装

    pip install Flask-Script
    

    2、接下来再基于上面的项目,加入Flask-Script,使我们可以用命令启动项目

      其实本部分就是为下面的Flask-Migrate做铺垫,Flask-Script 顾名思义就是 Flask 的脚本。你是否还记得Django的启动命令呢?没错,就是 python manager.py runserver,其实Flask也可以做到,基于 Flask-Script 就可以了。

      2.1、将Flask-Script加入到Flask项目中

    from flask_script import Manager    # 导入Flask-Script中的Manager
    
    from app import create_app
    
    my_app = create_app()
    
    manager = Manager(my_app)    # 让app支持manager
    
    if __name__ == '__main__':
        # my_app.run()
        manager.run()   # 替换原来的 my_app.run() 就可以了
    manager.py

      2.2、使用命令启动Flask项目

    python manager.py runserver
    

      2.3、启动Flask项目,并更改配置参数(监听的IP地址和端口号)

    python manager.py runserver -h 0.0.0.0 -p 9527
    

      2.4、高级操作 - 自定制脚本命令

         方式一:@manager.command

    from flask_script import Manager    # 导入Flask-Script中的Manager
    
    from app import create_app
    
    my_app = create_app()
    
    manager = Manager(my_app)    # 让app支持manager
    
    @manager.command
    def runflask(arg):
        # my_app.run()   # 释放此句项目humg住
        print(arg)
    
    
    if __name__ == '__main__':
        # my_app.run()
        manager.run()   # 替换原来的 my_app.run() 就可以了
    manager.py

        执行命令:

    python manager.py runflask 22

        结果如下图:

        方式二:@manager.option("-短指令", "--长指令", dest="变量名")

    from flask_script import Manager    # 导入Flask-Script中的Manager
    
    from app import create_app
    
    my_app = create_app()
    
    manager = Manager(my_app)    # 让app支持manager
    
    @manager.command
    def runflask(arg):
        # my_app.run()   # 释放此句项目humg住
        print(arg)
    
    
    @manager.option("-n", "--name", dest="name")
    @manager.option("-s", "--say", dest="say")
    def talk(name, say):
        print(f"{name}可真{say}")
    
    
    if __name__ == '__main__':
        # my_app.run()
        manager.run()   # 替换原来的 my_app.run() 就可以了
    manager.py

        执行命令:

    python manager.py talk -n 你 -s 厉害
    python manager.py talk --name 我 --say 厉害

        结果如下图:

     

    四、Flask-Migrate

    1、安装

    pip install Flask-Migrate
    

    2、继续基于上面的项目,使Flask项目支持makemigration和migrate

      2.1、将 Flask-Migrate (注意:Flask-Migrate要依赖Flask-Script组件)加入到项目中

    from flask_script import Manager    # 导入Flask-Script中的Manager
    # 导入 Flask-Migrate 中的 Migrate 和 MigrateCommand
    # 这两个东西说白了就是想在 Flask-Script 中添加几个命令和指令而已
    from flask_migrate import Migrate, MigrateCommand
    
    from app import create_app
    
    my_app = create_app()
    
    manager = Manager(my_app)    # 让app支持manager
    
    from app import db
    Migrate(my_app, db)  # 既然是数据库迁移,那么就得告诉他数据库在哪里,并且告诉他要支持哪个app
    # 接下来再告诉manager 有新的指令了,这个新指令在MigrateCommand 中存着呢
    manager.add_command("database", MigrateCommand)  # 当你的命令中出现 database 指令,则去MigrateCommand中寻找对应关系
    """
    数据库迁移指令:
    python manager.py database init 
    python manager.py database migrate     # 相当于Django中的 makemigration
    python manager.py database upgrade     # 相当于Django中的 migrate
    """
    
    
    @manager.command
    def runflask(arg):
        # my_app.run()   # 释放此句项目humg住
        print(arg)
    
    
    @manager.option("-n", "--name", dest="name")
    @manager.option("-s", "--say", dest="say")
    def talk(name, say):
        print(f"{name}可真{say}")
    
    
    if __name__ == '__main__':
        # my_app.run()
        manager.run()   # 替换原来的 my_app.run() 就可以了
    manager.py

      2.2、执行数据库初始化指令

    python manager.py database init

        结果如下图:

        此时你会发现你的项目目录中出现了一个migrations目录,如下图:

     

      2.3、执行数据库迁移指令

    python manager.py database migrate     # 相当于Django中的 makemigration
    python manager.py database upgrade     # 相当于Django中的 migrate

        结果如下图:

     

         此时你会发现数据库中出现了一个users表。

  • 相关阅读:
    Oracle Core 学习笔记二 Transactions 和 Consistency 说明
    Oracle AUTO_SPACE_ADVISOR_JOB 说明
    Windows 下 ftp 上传文件 脚本
    Oracle 11g 中 Direct path reads 特性 说明
    Linux 使用 wget 下载 Oracle 软件说明
    Oracle 10g read by other session 等待 说明
    Oracle 11g RAC INS06006 Passwordless SSH connectivity not set up between the following node(s) 解决方法
    SecureCRT 工具 上传下载数据 与 ASCII、Xmodem、Ymodem 、Zmodem 说明
    Oracle RAC root.sh 报错 Timed out waiting for the CRS stack to start 解决方法
    Oracle RESETLOGS 和 NORESETLOGS 区别说明
  • 原文地址:https://www.cnblogs.com/li-li/p/10383466.html
Copyright © 2011-2022 走看看