flask请求参数,工厂函数及简单子应用实现
视图处理过程中,都是接收请求,处理逻辑,返回响应
flask中
request对象 不是 局部对象,也不属于某个视图函数,而是在 全局中 拥有同一个 请求对象
路径参数
GET student/1/
-
int: 获取整数 -
string: 也是默认类型,得到字符串
# GET student/1/
查询字符串参数
GET student/list/?page=3&size=5&a=3&a=9: 一般是 GET请求时,传递 查询字符串参数
from flask import request
请求体参数-表单数据
POST、PUT可以携带请求体参数, 请求体参数包括: 表单数据、json数据flask视图处理过程中,默认只 支持
GET请求,想要支持其他请求方式,应该指明 请求方式
请求体参数-json
小结
将 查询和添加 放到同一个视图中,判断不同的请求方式,从而执行不同的处理逻辑
项目构造
python包
flask项目,一切功能围绕 核心app 来完成, 这个包就用来构造 核心APP
-
app/settings.py: 项目的配置文件
class Config(object):
DEBUG = True
SQLALCHEMY_DATABASE_URI = 'mysql://root:mysql@localhost:3306/flask'
# mysql://用户名:密码@IP地址:端口号/数据库名
SQLALCHEMY_TRACK_MODIFICATIONS = False
-
app/extensions.py: 项目所使用的第三方扩展插件
from flask_sqlalchemy import SQLAlchemy
from flask_migrate import Migrate
from flask_cors import CORS
# 环境中,使用 mysqlclient 链接mysql,就可以正常使用
# 如果使用的是pymysql链接 mysql, 就需要加一些配置项
# import pymysql
# pymysql.install_as_MySQLdb()
db = SQLAlchemy()
migrate = Migrate()
cors = CORS()
def config_extensions(app):
db.init_app(app)
migrate.init_app(app, db=db)
cors.init_app(app)
-
app/__init__.py: 定义工厂函数,生成核心flask APP
from flask import Flask
from .settings import Config
from .extensions import config_extensions
def create_app():
# 1. 创建APP
app = Flask(__name__)
# 2. 导入配置参数
app.config.from_object(Config)
# 3. 导入 第三方的插件
config_extensions(app)
# 4. 返回APP
return app
项目的管理文件
在项目中,创建
manage.py
-
manage.py
from flask_script import Manager, Server
from flask_migrate import MigrateCommand
from app import create_app
# 1. 利用工厂函数生成app
app = create_app()
# 2. 创建管理对象,管理项目
manage = Manager(app)
# 3. 构建命令
manage.add_command('runserver', Server(host='0.0.0.0', port=7000))
manage.add_command('db', MigrateCommand)
if __name__ == '__main__':
# 利用管理器启动服务
manage.run()
命令
在项目的终端可以使用如下命令,操作项目
python manage.py runserver # 启动flask 服务 python manage.py db init # 只有第一次迁移时,才会执行 该命令, 执行完,会生成迁移文件 python manage.py db migrate # 生成迁移文件,出路第一次之外,任何修改模型类,都需要 执行该命令, 生成迁移文件 python manage.py db upgrade # 根据迁移文件,生成表
学校子应用
-
school/__init__.py: 创建蓝图对象, 创建完成,需要 注册蓝图
from flask.blueprints import Blueprint
school_bp = Blueprint('school', __name__)
# 为了让蓝图,管理你的 模型类和视图,因此需要导入
from .models import *
from .views import *
-
school/models.py: 创建模型类
from app.extensions import db
# 学生: id、姓名、年龄、性别
class Student(db.Model):
__tablename__ = 'tb_student' # 指定表名
id = db.Column(db.Integer, primary_key=True, autoincrement=True)
name = db.Column(db.String(20))
age = db.Column(db.Integer)
gender = db.Column(db.String(5))
需要在 蓝图,导入模型类,以便项目识别 模型类
生成迁移文件:
python manage.py db migrate生成表:
python manage.py db upgrade
视图
school/views.py: 实现 逻辑处理
from flask import request
from school import school_bp
from .models import Student
from app.extensions import db
from sqlalchemy.exc import SQLAlchemyError
@school_bp.route('/student/', methods=['POST', 'GET'])
def student():
# 添加学生 POST student/ 表单参数
if request.method == 'POST':
# 1. 接收参数
name = request.form.get('name')
age = request.form.get('age')
gender = request.form.get('gender')
# 2. 校验参数
if not all([name, age, gender]):
return {'msg': '缺少必要参数'}, 400
# 3. 存入数据库
# 3.1 创建学生对象成功,得到学生对象
stu = Student(name=name, age=age, gender=gender)
# 3.2 添加到 db 事务中
db.session.add(stu)
# 3.3 提交 事务, 因为,不提交事务之前,数据并没有保存到数据库,不会发生错误
try:
db.session.commit()
except SQLAlchemyError as e:
# print(e)
return {
'msg': '添加失败'
}, 500
# 4. 返回响应
return {
'id': stu.id,
'name': stu.name,
'age': stu.age,
'gender': stu.gender
}, 201
else:
# 1. 查询所有学生,得到查询集
students = Student.query.all()
# 2. 循环遍历查询集,解析数据
data = []
for s in students:
data.append({
'id': s.id,
'name': s.name,
'age': s.age,
'gender': s.gender,
})
# 3. 返回响应
return {'students': data}, 200

浙公网安备 33010602011771号