码迷,mamicode.com
首页 > 其他好文 > 详细

flask项目构造

时间:2021-06-02 18:46:20      阅读:0      评论:0      收藏:0      [点我收藏+]

标签:class   out   表名   插件   第三方   get   配置文件   配置参数   settings   

项目构造

在flask项目中,一切功能围绕核心app来完成,这个包就用来构造核心app

  • 在项目中创建一个名为app的python包
    • settings.py 文件作为项目的配置文件
    • extensions.py 项目的第三方扩展插件
    • __init__.py 定义工厂函数,生成核心app
  • 在项目的顶级目录下创建项目的管理文件,习惯性命名为manage.py
  • 子应用,创建子应用的python包
    • __init__.py 创建蓝图,创建完成后在核心app中注册蓝图
    • models.py 创建模型类
    • views.py 实现逻辑处理
APP包
settings.py 文件作为项目的配置文件
class Config(object):
    DEBUG = True
    SQLALCHEMY_DATABASE_URI = ‘mysql://用户名:密码@IP地址:端口号/数据库名‘
    SQLALCHEMY_TRACK_MODIFICATIONS = False
    
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)

__init__.py 定义工厂函数,生成核心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
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,post = 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  # 根据迁移文件,生成表
子应用

创建子应用的python包

__init__.py 创建蓝图,创建完成后在核心app中注册蓝图
from flask.blueprints import Blueprint


school_bp = Blueprint(‘school‘, __name__)


# 为了让蓝图,管理你的 模型类和视图,因此需要导入
from .models import *
from .views import *
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))
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 {‘mgs‘: ‘缺少必要参数‘}, 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中 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

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)
请求体参数

POST、PUT可以携带请求体参数,请求体参数包括:表单数据,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
        }

flask项目构造

标签:class   out   表名   插件   第三方   get   配置文件   配置参数   settings   

原文地址:https://www.cnblogs.com/history0403/p/14831136.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!