Flask框架

项目构造

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 {'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

 

posted @ 2021-05-31 15:30  政子python  阅读(435)  评论(1)    收藏  举报