flask请求参数,工厂函数及简单子应用实现

Posted DoomLs

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了flask请求参数,工厂函数及简单子应用实现相关的知识,希望对你有一定的参考价值。

请求参数

视图处理过程中,都是接收请求,处理逻辑,返回响应

flask中 request对象 不是 局部对象,也不属于某个视图函数,而是在 全局中 拥有同一个 请求对象

路径参数

GET student/1/

  • int: 获取整数

  • string: 也是默认类型,得到字符串

# GET  student/1/
@school_bp.route(\'/student/<int:pk>/\')
def student_detail(pk):
   return {
       \'id\': pk
  }

查询字符串参数

GET student/list/?page=3&size=5&a=3&a=9: 一般是 GET请求时,传递 查询字符串参数

from flask import request

@student_bp.route(\'student/list/\')
def student_list():
   # 1. 获取查询字符串参数
   page = request.args.get(\'page\') # 根据参数的键获取具体的值
   size = request.args.get(\'size\') # 获取单个值
   a = request.args.getlist(\'a\') # 根据参数的键,获取对应的多个值,格式为列表
   
   
   return \'查询第{}页学生数据,每页{}条\'.format(page, size)
   

请求体参数-表单数据

POSTPUT 可以携带请求体参数, 请求体参数包括: 表单数据、json数据

flask视图处理过程中,默认只 支持 GET请求,想要支持其他请求方式,应该指明 请求方式


@school_bp.route(\'/student/form/\', methods=[\'POST\'])
def student_create():
   name = request.form.get(\'name\')
   age = request.form.get(\'age\')
   gender = request.form.get(\'gender\')

   return {
       \'id\': 1,
       \'name\': name,
       \'age\': age,
       \'gender\': gender
  }

请求体参数-json

@school_bp.route(\'/student/json/\', methods=[\'POST\'])
def student_json_create():
   name = request.json.get(\'name\')
   age = request.json.get(\'age\')
   gender = request.json.get(\'gender\')

   return {
              \'name\': name,
              \'age\': age,
              \'gender\': gender
          }, 201

小结

将 查询和添加 放到同一个视图中,判断不同的请求方式,从而执行不同的处理逻辑

@school_bp.route(\'/student/\', methods=[\'GET\', \'POST\'])
def student():
   # 如果请求方式是 GET, 返回学生列表数据
   if request.method == \'GET\':
       page = request.args.get(\'page\', 1)
       size = request.args.get(\'size\', 5)

       return {
           \'page\': page,
           \'size\': size,
           \'student\': [{\'id\': 1, \'name\': "小米"}]
      }
   
   # 如果请求方式是POST, 获取请求体参数,保存学生数据,返回响应
   else:
       name = request.form.get(\'name\')
       age = request.form.get(\'age\')
       gender = request.form.get(\'gender\')
       
       if not all([name, age, gender]):
           return {\'msg\': \'缺少必要参数\'}, 400

       return {
           \'id\': 1,
           \'name\': name,
           \'age\': age,
           \'gender\': gender
      }

项目构造

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

以上是关于flask请求参数,工厂函数及简单子应用实现的主要内容,如果未能解决你的问题,请参考以下文章

一个简单的flask程序

Flask!

flask笔记(七):简单路由设置

Flask框架工厂函数用法实例分析

flask 工厂模式与celery结合

flask 工厂模式与celery结合