目录
搭建基于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
三、项目总体配置文件
- 创建一个
config
目录,目录下创建一个settings.py
文件 - 写下总体配置
# 配置
# 全为大写: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”了
六、引入蓝图
允许你将应用程序拆分为多个模块或组件,每个组件可以定义自己的路由、模板、静态文件等。
蓝图的主要目的是让大型应用程序更易于维护和扩展。
- 创建一个
route
模块包 - 在
route
目录下创建一个user
模块包,用于用户管理 - 在
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 "删除成功"
这个时候访问对应的路由,数据库里就能看到对应的操作结果了
以上只是我的学习记录,如有问题尽管提