搭建基于flask的web应用框架

发布于:2025-03-15 ⋅ 阅读:(13) ⋅ 点赞:(0)

搭建基于flask的web应用框架

一、创建项目

具体看另一篇文章:
https://blog.csdn.net/qq_45742976/article/details/132028753

我之后要创建的的文件,大致如下:
在这里插入图片描述

二、项目依赖包

创建一个 requirements.txt 文件

flask
flask_cors
requests
flask_sqlalchemy
pymysql
flask_migrate
flask_mail
Flask-Caching
PyJWT
bcrypt==4.1.1
cryptography==41.0.2

在控制台一键安装这些包

pip install -r requirements.txt

三、项目总体配置文件

  1. 创建一个 config 目录,目录下创建一个settings.py 文件
  2. 写下总体配置
# 配置  
# 全为大写:from_object的硬性判断  
# DEBUG开启调试模式,应用程序会提供详细的错误信息和日志  
DEBUG = True  
HOST = "127.0.0.1"  
PORT = 8000  
  
# 这里可以保存全局变量,作为配置  

四、创建核心对象

app.py 文件里创建类,并读取配置

# 核心对象的设置和创建  
# 把配置读入app.config:从config.settings里读,从系统环境变量flask_conf里读取配置  
import os  
from flask import Flask  
  
def create_app():  
    # 创建核心对象,一个 Flask 应用程序实例  
    tz_app = Flask(__name__)  
  
	# 从Python模块加载配置  
	tz_app.config.from_object('config.settings')  
	if 'FLASK_CONF' in os.environ:  
	    # 从环境变量指定的文件加载配置  
	    tz_app.config.from_envvar('FLASK_CONF')
	
	# 可以先写一个路由
    @tz_app.route('/')  
    def index():  
        return "index"  
  
    return tz_app

五、启动文件

server.py 文件里导入核心对象,并运行

# 启动文件,程序入口  
from app import create_app  
  
# 创建flask应用程序的实例  
tz_app = create_app()  
  
if __name__ == "__main__":  
    # 使用内置小型服务器启动app应用  
    tz_app.run(host=tz_app.config['HOST'],  
                port=tz_app.config['PORT'],  
                debug=tz_app.config['DEBUG'])

运行之后就可以在页面http://127.0.0.1:8000看见“index”了

六、引入蓝图

允许你将应用程序拆分为多个模块或组件,每个组件可以定义自己的路由、模板、静态文件等。
蓝图的主要目的是让大型应用程序更易于维护和扩展。

  1. 创建一个route 模块包
  2. route 目录下创建一个user 模块包,用于用户管理
  3. user 下自带的__init__.py 文件中创建蓝图对象
# user_bp用户管理  
  
from flask import Blueprint  
  
# 创建蓝图对象  
# Blueprint("蓝图名称", 模块名称, url_prefix="为蓝图中的所有路由添加前缀")  
user_bp = Blueprint("user_bp", __name__, url_prefix="/v1/user")  

route目录下自带的init文件中定义一个函数,注册这个蓝图

from .user import user_bp  
  
def route_tz_app(app):  
    # 在需要时注册蓝图  
    app.register_blueprint(user_bp)

app.py文件,创建核心对象的类里调用函数

def create_app():  
    # 创建核心对象,一个Flask应用程序实例
    tz_app = Flask(__name__)  
  
    # 从Python模块加载配置  
    tz_app.config.from_object('config.settings')  
    if 'FLASK_CONF' in os.environ:  
        # 从环境变量指定的文件加载配置  
        tz_app.config.from_envvar('FLASK_CONF')  
  
    @tz_app.route('/')  
    def index():  
        return "index"  
  
    # 调用函数,将蓝图注册到应用程序(绑定路由与app)  
    import route  
    route.route_tz_app(tz_app)  
  
    return tz_app

现在可以在user模块包下创建一个user_routes.py文件,写路由了

# 导入蓝图  
from . import user_bp  
  
# 使用蓝图定义路由  
@user_bp.route("/list")  
def user_list():  
    return "user_list"

记得在roure/user/__init__.py文件里导入路由文件

# user_bp用户管理  
  
from flask import Blueprint  
  
# 创建蓝图对象  
# Blueprint("蓝图名称", 模块名称, url_prefix="为蓝图中的所有路由添加前缀")  
user_bp = Blueprint("user_bp", __name__, url_prefix="/user")  
  
# 只有在路由文件被导入时,装饰器才会生效,路由函数才会被注册到蓝图中
# 如果没有导入,访问时会返回404,路由函数不会被调用
from . import user_routes

现在在页面上访问/user/list,将展示“user_list”

七、连接数据库

settings.py 文件写下数据库配置

# 配置  
# 全为大写:from_object的硬性判断  
# DEBUG开启调试模式,应用程序会提供详细的错误信息和日志  
DEBUG = True  
HOST = "127.0.0.1"  
PORT = 8000  
  
# 这里可以保存全局变量,作为配置  
  
# orm数据库连接设置  
# 使用pymysql连接  
# mysql://username:password@ip:port/database  
# 将 # 编码为 %23
SQLALCHEMY_DATABASE_URI = "mysql+pymysql://root:Chen%23123@192.168.190.110:3306/tz"

创建models模块包,在自带的__init__.py 文件里写下:

# 这是models模块的初始化文件,用于定义和初始化 SQLAlchemy 对象。
# ORM 对象关系映射  
from flask_sqlalchemy import SQLAlchemy  
  
# 创建一个SQLAlchemy对象db,用于管理数据库操作 
db = SQLAlchemy()  
  
# 绑定app,db就可以在应用程序中使用
def init_db(app):  
    db.init_app(app)

app.py里调用

import os  
from flask import Flask  
  
def create_app():  
    # 创建核心对象,一个Flask应用程序实例  
    tz_app = Flask(__name__)  
  
    # 从Python模块加载配置  
    tz_app.config.from_object('config.settings')  
    if 'FLASK_CONF' in os.environ:  
        # 从环境变量指定的文件加载配置  
        tz_app.config.from_envvar('FLASK_CONF')  
  
    @tz_app.route('/')  
    def index():  
        return "index"  
  
    # 调用函数,将蓝图注册到应用程序(绑定路由与app)  
    import route  
    route.route_tz_app(tz_app)  
  
    # 将db对象绑定到应用程序  
    import models  
    models.init_db(tz_app)  
  
    # 在应用程序上下文中,自动创建和更新数据库表  
    from models import db  
    with tz_app.app_context():  
        db.create_all()  
  
    return tz_app

server.py文件里

# 启动文件,程序入口  
from app import create_app  
  
# 创建flask应用程序的实例  
tz_app = create_app()  
  
from flask_migrate import Migrate  
from models import db  
# 创建一个迁移对象,将应用程序tz_app与数据库db关联  
migrate = Migrate(tz_app, db)  
  
  
if __name__ == "__main__":  
    # 使用内置小型服务器启动app应用  
    tz_app.run(host=tz_app.config['HOST'],  
                port=tz_app.config['PORT'],  
                debug=tz_app.config['DEBUG'])

打开控制台,输入以下命令

# 将server.py作为程序的入口文件
set FLASK_APP=server.py

# 初始化迁移环境
flask db init
# 初始化之后,会出现migrations目录

# 生成迁移脚本,记录数据库模型的变更
flask db migrate

# 应用迁移脚本,更新数据库表结构
flask db upgrade

如果后续要修改数据库里表的字段,修改完之后要在控制台运行以下命令才能进行同步

flask db migrate
flask db upgrade

Flask-Migrate 是一个 Flask 扩展,用于处理数据库迁移。它可以自动生成迁移脚本,并将数据库模式的变化(如新增字段、修改字段类型)应用到数据库中。

  • 迁移脚本记录了数据库模式的变化历史,便于回滚和版本控制。
  • 回滚到上一个迁移版本:flask db downgrade

八、数据库操作(ORM)

创建表

在models模块包下创建user.py,此文件描述用户相关的表

from . import db  
  
# User类继承自db.Model,表示这是一个数据库模型类  
class User(db.Model):  
    # 定义表名  
    __tablename__ = "user"  
    # 定义关键字  
    # 关键字=db.Column(数据类型(长度),primary_key是否主键,autoincrement是否自增,nullable是否可以为空)  
    user_id = db.Column(db.Integer, primary_key=True, autoincrement=True)  
    username = db.Column(db.String(100), nullable=False, unique=True)  
    password = db.Column(db.String(100), nullable=False)  
    email = db.Column(db.String(100), nullable=False, unique=True)  
    avatar = db.Column(db.String(255), nullable=False, default='https://books.toscrape.com/static/oscar/favicon.ico')```
记得在init文件里导入一下
```python
# ORM 对象关系映射  
from flask_sqlalchemy import SQLAlchemy  
  
# 生成对象关系映射  
db = SQLAlchemy()  
  
# 绑定app  
def init_db(app):  
    db.init_app(app)  
  
# 导入user模块,确保User模型被注册到db对象中  
from . import user

这个时候运行程序,就能看到库里有user表了

操作表数据

route/user/user_routes.py文件,用于对用户的相关操作

# 导入蓝图  
from . import user_bp  
from models.user import User  
from models import db  
# 数据以json格式返回
from flask import jsonify  
  
# 使用蓝图定义路由  
@user_bp.route("/list")  
def user_list():  
    # get查找  
    # user = User.query.get(1)  
    # print(user.username)    
    # filter_by查找。filter_by根据条件查询  
    # users = User.query.filter_by(username="test")  
    # for user in users:  
    #     print(user.username) 
    # 查询所有用户  
    users = User.query.all()  
    # 结果以json格式返回  
    user_list = [{  
        "id": user.user_id,  
        "username": user.username  
    } for user in users]  
    return jsonify(user_list)  
  
@user_bp.route("/register")  
def user_register():  
    # 1. 创建ORM对象  
    user = User(username="test1", password="t1")  
    # 2. 将ORM对象添加到db.session数据库会话中  
    db.session.add(user)  
    # 提交会话,将db.session中的改变同步到数据库  
    db.session.commit()  
    return "用户创建成功"  
  
@user_bp.route("/update")  
def user_update():  
    user = User.query.filter_by(username="test").first()  
    user.password = "22"  
    db.session.commit()  
    return "修改成功"  
  
@user_bp.route("/delete")  
def user_delete():  
    user = User.query.filter_by(username="test").first()  
    db.session.delete(user)  
    db.session.commit()  
    return "删除成功"

这个时候访问对应的路由,数据库里就能看到对应的操作结果了

以上只是我的学习记录,如有问题尽管提