• Flask 项目创建:


    创建一个空文件pycharm打开,并创建虚拟环境

    一次性安装以下所有:pip install -r r.txt

    1. Flask==1.1.4
    2. Flask-Caching==1.10.1
    3. Flask-Cors==3.0.10
    4. Flask-Migrate==2.7.0
    5. Flask-RESTful==0.3.9
    6. Flask-Script==2.0.6
    7. Flask-SQLAlchemy==2.5.1
    8. MarkupSafe==2.0.1
    9. PyJWT==2.3.0
    10. PyMySQL==1.0.2
    11. qiniu==7.6.0
    12. redis==4.2.2
    13. # 可以放置在**.txt文件 一次性安装

    挂载项   create_app.py

    1. from flask import Flask
    2. from flask_cors import CORS
    3. from model.model import db
    4. from views.views import goods_dp
    5. def create_app(config):
    6. flask_app = Flask(__name__)
    7. flask_app.config.from_object(config) # 挂在配置项
    8. cors = CORS(flask_app) # 跨域
    9. flask_app.register_blueprint(goods_dp) # 注册蓝图
    10. db.init_app(flask_app) # 绑定数据库连接对象
    11. # # flask_app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = True
    12. return flask_app

    程序入口        app.py 

    1. from config.settings import Config
    2. from create_app import create_app
    3. app = create_app(Config)
    4. # if __name__ == '__main__':
    5. # app.run('127.0.0.1',port=18888)

    配置项   config >> settings.py

     current_app.config.get('SECRET_KEY')        # 配置项取值语法

    1. class Config():
    2. SECRET_KEY = 'dasezytxrdtf'
    3. SQLALCHEMY_DATABASE_URI = 'mysql+pymysql://root:123456@127.0.0.1:3306/20220919db'
    4. SQLALCHEMY_TRACK_MODIFICATIONS = False # 是否追踪数据库发生的变化
    5. SQLALCHEMY_ECHO = True # 是否在控制台打印输出sql语句
    6. JSON_AS_ASCII = False # 返回JSON的时候不转义中文

     迁移项        manage.py

    1. from flask_migrate import Migrate, MigrateCommand
    2. from flask_script import Manager # script第三方扩展
    3. from app import app
    4. from model.model import db
    5. # 1.创建命令行对象
    6. manage = Manager(app)
    7. # 2.创建迁移对象
    8. migrate = Migrate(app, db)
    9. # 3.添加迁移命令到命令行对象
    10. manage.add_command('db', MigrateCommand)
    11. # 4.运行
    12. if __name__ == '__main__':
    13. manage.run()

     模型类        models >> model.py

    1. from flask_sqlalchemy import SQLAlchemy
    2. db = SQLAlchemy()
    3. class GoodsModel(db.Model):
    4. id = db.Column(db.Integer, primary_key=True, autoincrement=True)
    5. title = db.Column(db.String(128), comment='商品名')
    6. desc = db.Column(db.Text, comment='商品简介')
    7. price = db.Column(db.DECIMAL(10, 2), comment='价格')
    8. img = db.Column(db.String(128), comment='图片')

    创建数据库 settings.py中指定的 20220919db库名

    python manage.py db init        # 初始化

    python manage.py db migrate        # 迁移数据库

    python manage.py db        # 查看所有命令

    python manage.py db upgrade        # 执行迁移

      视图        views >> views.py

    1. import random
    2. from datetime import datetime
    3. from flask import Blueprint, request, jsonify
    4. from flask_restful import Api, Resource
    5. from model.model import GoodsModel, db
    6. goods_dp = Blueprint('goods_dp', __name__, url_prefix='/v1')
    7. api = Api(goods_dp)
    8. class GoodsView(Resource):
    9. def get(self):
    10. # 查看所有商品
    11. goods_list = GoodsModel.query.all() # 获取所有对象
    12. goods_all = []
    13. for goods in goods_list:
    14. d = {
    15. 'id': goods.id,
    16. 'title': goods.title,
    17. 'price': str(goods.price), # DECIMAL类型 不能被JSON序列化
    18. 'desc': goods.desc,
    19. # 'img': request.scheme + '://' + request.host + '/' + goods.img,
    20. # 协议 + :// + 主机地址 + / + 图片名
    21. # 'img': '%s://%s/%s' % (request.scheme, request.host, goods.img)
    22. 'img': 'http://127.0.0.1:5000/' + goods.img
    23. }
    24. goods_all.append(d)
    25. return jsonify({'code': 200, 'msg': '商品列表获取成功',
    26. 'data': goods_all})
    27. def post(self):
    28. # 添加商品
    29. args = request.json
    30. title = args.get('title')
    31. desc = args.get('desc')
    32. price = args.get('price')
    33. img = args.get('img')
    34. if not all([title, desc, price, img]):
    35. return jsonify({'code': 400, 'msg': '参数不完整'})
    36. goods = GoodsModel(title=title, price=price, desc=desc, img=img)
    37. db.session.add(goods)
    38. db.session.commit()
    39. return jsonify({'code': 200, 'msg': '添加成功'})
    40. class GoodsInfoView(Resource):
    41. def get(self, id):
    42. # 获取一条商品
    43. goods_info = GoodsModel.query.get(id) # 获取一条对象
    44. if not goods_info:
    45. return jsonify({'code': 400, 'msg': '商品不存在'})
    46. return jsonify({
    47. 'code': 200,
    48. 'msg': '商品获取成功',
    49. 'data': {
    50. 'id': goods_info.id,
    51. 'title': goods_info.title,
    52. 'desc': goods_info.desc,
    53. 'price': str(goods_info.price),
    54. 'img': '%s://%s/%s' % (request.scheme, request.host, goods_info.img),
    55. }
    56. })
    57. def put(self, id):
    58. # 修改一条商品
    59. args = request.json
    60. title = args.get('title')
    61. desc = args.get('desc')
    62. price = args.get('price')
    63. img = args.get('img')
    64. goods_info = GoodsModel.query.get(id)
    65. if not goods_info:
    66. return jsonify({'code': 400, 'msg': '商品不存在'})
    67. if title and title != goods_info.title: # title不为空 并且修改后的值发生改变 才进行修改
    68. goods_info.title = title
    69. if desc and desc != goods_info.desc:
    70. goods_info.desc = desc
    71. if price and price != goods_info.price:
    72. goods_info.price = price
    73. if img and img != goods_info.img:
    74. goods_info.img = img
    75. db.session.commit()
    76. return jsonify({'code': 200, 'msg': '修改成功'})
    77. def delete(self, id):
    78. # 删除一条商品
    79. goods_info = GoodsModel.query.get(id)
    80. if not goods_info:
    81. return jsonify({'code': 400, 'msg': '商品不存在'})
    82. GoodsModel.query.filter(GoodsModel.id == id).delete()
    83. db.session.commit()
    84. return jsonify({'code': 200, 'msg': '删除成功'})
    85. # 上传图片
    86. class UploadView(Resource):
    87. def post(self):
    88. img = request.files.get('img')
    89. filename = datetime.strftime(datetime.now(), '%Y%m%d%H%M%S')
    90. filename += str(random.randint(100000, 999999))
    91. filename += '.'
    92. filename += img.filename.split('.')[-1]
    93. img.save('./static/%s' % filename)
    94. return jsonify({'code': 200, 'msg': '文件上传成功',
    95. 'data': {'filename': 'static/%s' % filename}})
    96. api.add_resource(GoodsView, '/goods')
    97. api.add_resource(GoodsInfoView, '/goods/')
    98. api.add_resource(UploadView, '/upload')

    reqparse.RequestParser()        接收参数

    1. from flask_restful import Api, Resource, reqparse
    2. class PotView(Resource):
    3. def post(self):
    4. req = reqparse.RequestParser()
    5. # required 代表这个字段 必须传入,可以传入空字符串
    6. # nullable=false 意味着你不能输入空
    7. # help当校验不通过的时给用户返回什么提示
    8. req.add_argument('title', required=True, nullable=False, help='选项不能为空')
    9. req.add_argument('is_ok', type=int, default=0)
    10. req.add_argument('que_id', type=int, required=True, nullable=False, help='题干不能为空')
    11. args = req.parse_args()
    12. # 接收参数为 args['title']
    13. q = QueModel(**args)
    14. db.session.add(q)
    15. db.session.commit(q)

  • 相关阅读:
    Cocos发布智能座舱解决方案“Cocos HMI”
    Alibaba数据源Druid可视化监控配置
    jeecg 启动 微服务 更改配置本地host地址
    专利-分析方法总结
    软件建模与分析
    Mining Association Rules between Sets of Items in Large Databases
    创建线程的技术难点
    Redis 持久化机制
    【MySQL】MySQL数据库锁使用与InnoDB加锁的原理解析
    golang中的WaitGroup实现原理
  • 原文地址:https://blog.csdn.net/Ben_boba/article/details/126960497