IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Python知识库 -> Day7 ---- 前后端分离与接口编写 -> 正文阅读

[Python知识库]Day7 ---- 前后端分离与接口编写

昨日回顾

1.单表查询常用方法有哪些?
2.SQLAlchemy中分页排序如何实现?
3.SQLAlchemy中逻辑运算与聚合如何使用?
4.一对多, 多对多关系如何创建?
5.关系查询如何实现?
6.Flask-SQLAlchemy如何执行自定义SQL语句?

今日内容

  1. 前后端分离项目的创建

  2. 学生管理系统案例 — 模型创建与迁移

  3. 学生管理系统案例 — 增删改查实现

  4. 前端页面编写与接口测试


1. 前后端分离项目

1.1 项目的创建

# 1.flask项目创建
project
	common  # 通用文件夹 
    	models  # 模型类文件夹
        settings  # 配置文件夹
        utils  # 工具脚本文件夹
        __init__.py
    project  # 项目内层目录
    	resources  # 蓝图源码文件夹
        main.py  # 主文件
        __init__.py

# 2.Vue项目创建
# 创建命令
vue create myProject
# 安装包
npm install 
npm install xxx -s

1.2 跨域配置

Flask跨域配置需要借助flask-cors扩展来实现。

# 安装
pip install flask-cors

# 全局配置跨域
from flask_cors import CORS

CORS(app, supports_credentials=True, 
    origins=["http://localhost:8080",], 
    methods=["GET", "POST", "PUT", "DELETE", "OPTIONS"], 
    allow_headers=["x-requested-with", 'content-type', 'authorization', "author"],
    expose_headers="*")
    

2. 学生管理系统

2.1 介绍与目标实现

# 项目目录创建
stusys
	common
		models
			stu.py  # 模型文件
			__init__.py
		settings
        	__init__.py
            default.py  # 配置文件
	stusys
		resources
			stu.py  # 蓝图
      	__init__.py
		main.py  # 主文件 app.py
  	manage.py  # 迁移脚本

2.2 模型创建与迁移

  1. models下的__init__.py中创建db对象
# __init__.py
from .stu import Sub, Stu, db
__all__ = ["Sub", "Stu", "db"]

# models > stu.py 创建模型
from flask_sqlalchemy import SQLAlchemy
db = SQLAlchemy()

# 专业表
class Sub(db.Model):
    __tablename__ = 'sub_tb'
    # 指定主键
    id = db.Column(db.Integer, primary_key=True, doc='专业的ID', autoincrement=True) # autoincrement默认为True
    name = db.Column(db.String(32), doc='专业名称')
    # 主表中指定关系
    stu_relation = db.relationship('Stu', backref="stu_tb", uselist=False) # uselist 

# 学生表
class Stu(db.Model):
    __tablename__ = 'stu_table'
    id = db.Column(db.Integer, primary_key=True, autoincrement=True, doc='学生ID')
    name = db.Column(db.String(32), doc='学生姓名')
    age = db.Column(db.Integer, doc='学生年龄')
    snum = db.Column(db.Integer, unique=True, doc='学生学号')
    sub_id = db.Column(db.Integer, db.ForeignKey('sub.id'), doc='专业外键')
    
  1. 创建工厂函数: 在stusys下的__init__.py下创建工厂函数
# stusys > __init__.py
from flask import Flask
from common.models import db

# 工厂函数
def creat_flask_app(config): # 配置类
    # 实例化app实例
    app = Flask(__name__)
    # 加载配置
    app.config.from_object(config)
    # db对象 绑定app
    db.init_app(app)
	
    # 绑定蓝图...
    
    # 创建api...
	
    return app
  1. 创建app: 在stusys下的main中创建app
# main.py 
import sys
import os
from flask_cors import CORS
# 将common加入python的搜索路径,可以在common下搜索;或者将BASE_DIR加入搜索路径
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))

sys.path.insert(0, os.path.join(BASE_DIR, 'common'))

from stusys import creat_flask_app
from common.settings.default import Config
# 创建app对象
app = creat_flask_app(Config)


if __name__ == '__main__':
	#  跨域
	CORS(app)
    app.run()
  1. 配置的创建: settings下的default.py
# settings > default.py 默认配置类
import pymysql
class Config(object):
	# pymysql
	pymysql.install_as_MySQLdb()
    SQLALCHEMY_DATABASE_URI = 'mysql://root:root@127.0.0.1:3306/jiyunstus'
    SQLALCHEMY_TRACK_MODIFICATIONS = False
    SQLALCHEMY_ECHO = True
  1. 创建迁移脚本
# manage.py
from flask_migrate import Migrate, MigrateCommand
from flask_script import Manager
from common.models.stu import Stu, Sub, db  # 模型类导入到迁移脚本
from stusys.main import app


manage = Manager(app)
migrate = Migrate(app, db)
manage.add_command('db', MigrateCommand)


if __name__ == '__main__':
    manage.run()

  1. 执行迁移命令
# 
# 创建数据库sql: create database jiyunsuts charset utf8;
python migrate.py db init # 初始化迁移的仓库,生成migrations目录
python migrate.py db migrate # 生成迁移文件
python migrate.py db upgrade # 同步到数据库

# 查看迁移历史
python manage.py db history
# 进入shell
python manage.py shell
# 查看当前的数据库版本
python manage.py db current
# 降低版本
python manage.py db downgrade xxx版本号
  1. 创建蓝图 resources > stu.py
# 
from flask import Blueprint
from flask_restful import Api, Resource, marshal

stubp = Blueprint('stubp', __name__)
api = Api(stubp)
# 视图类
class StuResource(Resource):
    def get(self):
        return 'test'
# 添加路由
api.add_resource(StuResource, '/stu', endpoint='stu')
  1. 注册蓝图与创建api
# main.py
from flask import Flask
from common.models import db
from flask_restful import Api, Resource
from resources.stu import stubp


# 工厂函数
def creat_flask_app(config):
    # 实例化app实例
    app = Flask(__name__)
    # 加载配置
    app.config.from_object(config)
    # db对象绑定app
    db.init_app(app)

    # 注册蓝图...
    app.register_blueprint(stubp)

    # 创建api...
    api = Api(app)
    return app
  1. 测试蓝图get请求
# 
postman访问: http://127.0.0.1:5000/stu
响应: "test"

3. 增删改查的实现

3.1 增加学生与专业信息

1. 增加专业与获取专业

# 
from flask import Blueprint
from flask_restful import Api, Resource, marshal
from flask_restful import reqparse
from common.models import Sub, Stu, db
from common.serializers import sub_fields
class SubResource(Resource):	
	# 获取所有的专业
    def get(self):
        subs = Sub.query.all()
        return marshal(subs, sub_fields)
	# 添加一个专业
    def post(self):
   		# 实例化请求解析对象
        reqps = reqparse.RequestParser()
        # 添加验证参数
        reqps.add_argument('name')
        # 解析验证参数
        args = reqps.parse_args()
        name = args['name']
		# 实例化专业对象
        sub = Sub(name=name)
        # 添加专业,并异常捕获
        try:
            db.session.add(sub)
            db.session.commit()
        except Exception as e:
            print(e)
            return '专业添加失败'

		
        return '{}-专业添加成功'.format(name)
    
api.add_resource(SubResorce, '/sub/')  # 添加路由

2. 增加学生

# 
class StuResource(Resource):
    # 增加学生
    def post(self):
    	reqps = RequestParser()
        reqps.add_argument('name', type=str)
        reqps.add_argument('age', type=int)
        reqps.add_argument('snum', type=int)
        reqps.add_argument('sub_id', type=int)
        args = reqps.parse_args()
        stu = Stu(name=args['name'], age=args['age'], snum=args['snum'], sub_id=args['sub_id'])
        try:
            db.session.add(stu)
            db.session.commit()
            return '添加成功'
        except Exception as e:
            print(e)
            return '添加失败'

2.3 修改学生信息

	# 更新学生数据 
    def put(self):
        # 获取修改学生的id
        reqps.add_argument('id', type=int, required=True)
        reqps.add_argument('name', type=str)
        reqps.add_argument('age', type=int)
        reqps.add_argument('snum', type=int)
        reqps.add_argument('sub_id', type=int)

        args = reqps.parse_args()
        stu_id = args['id']

        # # 查询学生
        stu = Stu.query.filter(Stu.id == stu_id)
        if stu.all():
            stu.update(args)
            db.session.commit()
            
            return '更新成功'
        else:
            
            return '更新失败'

2.4 查询学生信息

    def get(self):
        stus = Stu.query.all()
        return marshal(stus, stu_fields)

2.5 删除学生

    def delete(self):
        reqps.add_argument('id', type=int, required=True)
        args = reqps.parse_args()
        stu_id = args['id']
        
        stu = Stu.query.filter(Stu.id == stu_id) # base sql 永远为True,不能作为判断条件
        if stu.all(): # 能查询到
            stu.delete()
            db.session.commit()
            return '删除成功'
        else:
            return '删除失败'
  Python知识库 最新文章
Python中String模块
【Python】 14-CVS文件操作
python的panda库读写文件
使用Nordic的nrf52840实现蓝牙DFU过程
【Python学习记录】numpy数组用法整理
Python学习笔记
python字符串和列表
python如何从txt文件中解析出有效的数据
Python编程从入门到实践自学/3.1-3.2
python变量
上一篇文章      下一篇文章      查看所有文章
加:2022-07-03 10:44:49  更:2022-07-03 10:45:52 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/15 11:45:04-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码