1.flask以及相包的安装
Flask 1.1.2 # flask
Flask-Cors 3.0.10 # 前后端跨域包
Flask-Migrate 2.7.0 # 数据库的初始化包
Flask-RESTful 0.3.8 #
Flask-Script 2.0.6 # 向Flask插入外部脚本的功能
Flask-SQLAlchemy 2.5.1 # 是一个插件,第三方库
2.flask框架
2.1 flask的最简单的应用
(可以在新建的python的项目中的main.py文件中直接编写)
# 导入flask
from flask import Flask
# 导入配置文件
from config.settings import DevConfig
# 导入跨域包
from flask_cors import CORS
# 从模型类导入db
from models import db
# 从接口文件导入api以及ap
from Apis import api, bp
app = Flask(__name__)
CORS(app)
app.config.from_object(DevConfig)
api.init_app(app)
db.init_app(app)
app.register_blueprint(bp)
if __name__ == '__main__':
app.run(debug=True, port=9000)
2.2 配置文件
(在python项目中新建config包,在config包中创建配置文件settings)
class DevConfig:
# 开发模式
DEBUG = True
# 连接数据库,以及数据据库的配置
SQLALCHEMY_DATABASE_URI = 'mysql+pymysql://root:123@localhost:3306/mxn0526?charset=utf8'
# 注意 root:用户
123:数据库密码
localhost:主机(可以为127.0.0.1)
3306:数据库的端口
mxn0526:创建的数据库名
charset=utf8:编码方式
SQLALCHEMY_TRACK_MODIFICATIONS = False
2.3 模型类
1.(在python项目中新建models包,在models中创建文件model)
2.在--init--.py文件中写入
# 导入用于操作数据库的flask_sqlalchemy包
from flask_sqlalchemy import SQLAlchemy
# 将这个包进行实例化
db = SQLAlchemy()
导入所有的模型类
from models.models import *
3.模型类的具体写法
2.3.1 一对多
# 导入模型类需要的字段类型
from sqlalchemy import Column, String, Integer, DECIMAL, ForeignKey
# 导入实例化后的SQLALCHEMT
from models import db
# 创建模型类usermodel
lass UserModel(db.Model):
# 表名为user
__tablename__ = 'user'
# 注意 每张表必须要有主键,主键类型为Integet,可以设置主键自增
id = Column(Integer, autoincrement=True, primary_key=True)
username = Column(String(32), default='')
password = Column(String(255), default='')
phone = Column(String(12), default='')
# 建立主外键的查询关系,遵循双平行线原则
orders = db.relationship('OrderModel', backref='users')
class GoodsModel(db.Model):
__tablename__ = 'goods'
id = Column(Integer, autoincrement=True, primary_key=True)
name = Column(String(32), default='')
com_price = Column(DECIMAL(10, 2), default=0)
price = Column(DECIMAL(10, 2), default=0)
pic = Column(String(255), default='')
orders = db.relationship('OrderModel', backref='goods')
class OrderModel(db.Model):
__tablename__ = 'order'
id = Column(Integer, autoincrement=True, primary_key=True)
# 设置外键
user_id = Column(Integer, ForeignKey('user.id'))
goods_id = Column(Integer, ForeignKey('goods.id'))
name = Column(String(255), default='')
phone = Column(String(255), default='')
2.3.2 多对多(通过建立第三张表)
from models import db
from sqlalchemy import Column,Integer,String,Boolean,DateTime,ForeignKey
from datetime import datetime
class Movie(db.Model):
__tablename__ = "movie"
id = Column(Integer,primary_key=True,autoincrement=True)
name = Column(String(32))
brief = Column(String(200))
ctime = Column(DateTime,default=datetime)
class Ator(db.Model):
__tablename__ = "ator"
id = Column(Integer,primary_key=True,autoincrement=True)
name = Column(String(32))
gender= Column(Boolean,default=True)
class AtorMovie(db.Model):
__tablename__ = "reference"
id = Column(Integer,primary_key=True,autoincrement=True)
mid = Column(Integer,ForeignKey("movie.id"))
aid = Column(Integer,ForeignKey("ator.id"))
多对多(通过建立两张表的关系)
from sqlalchemy import Column, String, Integer, ForeignKey, DateTime
from models import db
from datetime import datetime
actor_to_movie = db.Table(
'actor_to_movie',
Column('actor_id',Integer,ForeignKey('actor.id')),
Column('movie_id',Integer,ForeignKey('movie.id'))
)
class ActorModel(db.Model):
__tablename__ = 'actor'
id = Column(Integer, autoincrement=True, primary_key=True)
gender = Column(Integer, default=1)
name = Column(String(32), unique=True)
class MovieModel(db.Model):
__tablename__ = 'movie'
id = Column(Integer, autoincrement=True, primary_key=True)
name = Column(String(32), unique=True)
brief = Column(String(255), default='')
add_time = Column(DateTime, default=datetime.now())
2.4 编写迁移脚本文件
(在python项目中新建manager.py文件)
from flask_migrate import Migrate,MigrateCommand
from flask_script import Manager
from main import app
from models import db
manager = Manager(app)
migrate = Migrate(app,db)
manager.add_command('db',MigrateCommand)
if __name__ == '__main__':
manager.run()
迁移命令(直接在终端执行即可)
1.python manager.py db inti
2.python manager.py db migrate
3.python mananer.py db upgrade
2.5路由以及接口文件
(在python项目中创建Apis包,在apis中创建views.py文件)
在apis包中的__init__文件中编写:
from flask_restful import Api
# 导入蓝图
from flask import Blueprint
# 导入视图文件中的所有views
from Apis.views import *
# 实例化api以及蓝图
api = Api()
bp = Blueprint('bp',__name__)
# 创建路由
api.add_resource(AddGoods,'/goods')
api.add_resource(LoginView,'/login')
api.add_resource(OrderView,'/order')
在views中编写
from flask_restful import Resource, reqparse
from models import *
from werkzeug.datastructures import FileStorage
import uuid
class AddGoods(Resource):
parser = reqparse.RequestParser()
parser.add_argument('name', type=str, location='form', help='名称')
parser.add_argument('price', type=float, location='form', help='名称')
parser.add_argument('com_price', type=float, location='form', help='名称')
parser.add_argument('pic', type=FileStorage, location='files', help='名称')
def post(self):
params = self.parser.parse_args()
name = params.get('name')
price = params.get('price')
com_price = params.get('com_price')
pic = params.get('pic')
filename = str(uuid.uuid4()) + '.' + pic.filename.replace('"', '').split('.')[-1]
pic.save(dst='static/' + filename)
obj = GoodsModel(
name=name,
price=price,
com_price=com_price,
pic=filename
)
db.session.add(obj)
db.session.commit()
return {'msg': '添加成功', 'code': 1000}
def get(self):
goods = GoodsModel.query.all()
goods_list = [{
'id': i.id,
'name': i.name,
'price': int(i.price),
'com_price': int(i.com_price),
'pic': i.pic
} for i in goods]
return {'msg': '', 'code': 1000, 'data': goods_list}
class LoginView(Resource):
parser = reqparse.RequestParser()
parser.add_argument('username', type=str, location='json', help='名称')
parser.add_argument('phone', type=str, location='json', help='名称')
def post(self):
params = self.parser.parse_args()
username = params.get('username')
phone = params.get('phone')
user_obj = UserModel.query.filter(UserModel.username == username).first()
if user_obj and user_obj.phone == phone:
return {'msg': '登录成功', 'code': 1000, 'user_id': user_obj.id,'user_name':user_obj.username}
else:
return {'msg': '登录失败', 'code': 10001}
class OrderView(Resource):
parser = reqparse.RequestParser()
parser.add_argument('user_id', type=int, location='json', help='名称')
parser.add_argument('goods_id', type=int, location='json', help='名称')
parser.add_argument('name', type=str, location='json', help='名称')
parser.add_argument('phone', type=str, location='json', help='名称')
def post(self):
params = self.parser.parse_args()
user_id = params.get('user_id')
goods_id = params.get('goods_id')
name = params.get('name')
phone = params.get('phone')
obj = OrderModel(
user_id=user_id,
goods_id=goods_id,
name=name,
phone=phone)
db.session.add(obj)
db.session.commit()
return {'msg':'提交成功','code':1000}
def get(self):
order_obj = OrderModel.query.all()
order_list = [{
'id':i.id,
'user_id':i.user_id,
'goods_name':i.goods.name,
'goods_price':int(i.goods.price),
'name':i.name,
'phone':i.phone
}for i in order_obj]
return {'msg':'','code':1000,'data':order_list}