FLask的简单应用

 


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}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值