对应模型类
from app.extensions import db
class Parent(db.Model):
__tablename__ = ‘tb_parent‘
id = db.Column(db.Integer,primary_key=True,autoincrement=True)
title = db.Column(db.String(20),nullable=False,unique=True)
class Child(db.Model):
__tablename__ = ‘tb_parent‘
id = db.Column(db.Integer,primary_key=True,autoincrement=True)
name = db.Column(db.String(20),nullable=False,unique=True)
img = db.Column(db.String(256)) #图片
parent_id = db.Column(db.Integer,db.ForeignKey(‘tb_parent.id‘))
parent = db.relationship(‘Parent‘,back_populates=‘parent‘)
import os
from uuid import uuid4
from flask import current_app # current_app 属于应用上下文,代表项目中的app本身
def img_upload(img):
if not img:
return None
# 将图片名按照 . 进行切分, 找到最后一个元素,也就是 文件的后缀名
end_name = img.filename.rsplit(‘.‘)[-1]
# 通过文件的后缀名判断 身份为 合法的 图片
if end_name not in [‘jpg‘, ‘png‘, ‘gif‘, ‘jpeg‘]:
return None
# 将 图片对象 存入 本地,然后将 路径 存入 数据库
MEDIA = current_app.config[‘MEDIA_ROOT‘] # 从app的配置项,取出 MEDIA的路径
filename = str(uuid4()) + ‘.‘ + end_name # 为了生成一个不重复的 文件名
img_path = os.path.join(MEDIA, filename) # 将路径和文件名拼接在一起,方便保存文件
img.save(img_path) # 将图片对象保存到 本地
return filename
添加图片时 注意获取图片的格式 为Files 图片类型为FileStorage
注意导包
from werkzeug.datastructures import FileStorage
from utils.img import img_upload 导入自定义图片存储
class ParentView(Resource):
def post(self):
# 1. 创建解析参数的对象
parser = reqparse.RequestParser()
# 2. 指明需要解析的参数
parser.add_argument(‘name‘, type=str, location=‘form‘, required=True)
parser.add_argument(‘parent_id‘, type=int, location=‘form‘, required=True)
parser.add_argument(‘img‘, type=FileStorage, location=‘files‘)
# 3. 获取具体的参数
args = parser.parse_args()
title = args.get(‘title‘)
content = args.get(‘content‘)
count = args.get(‘count‘)
cate_id = args.get(‘cate_id‘)
img = args.get(‘img‘)
# 利用自定义函数,将图片保存到本地
filename = img_upload(img)
# 4. 创建对象, 注意:图片存储的只是 从media之后的 图片路径
parent = Parent(name=name, img=filename, parent_id=parent_id)
# 5. 添加到 事务中
db.session.add(parent)
# 6. 提交事务
try:
db.session.commit()
except:
return {
‘msg‘: ‘添加失败‘
}, 500
# 7. 返回响应
return {
‘id‘: parent.id,
‘name‘: parent.name,
‘img‘: parent.img
}, 201
class ImgView(Resource):
def get(self, filename):
# 1. 从配置项中读取 media目录的 路径
MEDIA = current_app.config[‘MEDIA_ROOT‘]
# 2. 拼接除图片的完成路径
img_path = os.path.join(MEDIA, filename)
# 3. 按照二进制方式打开文件,读到的内容为 二进制文件流,方便接下来的网络传输
try:
with open(img_path, ‘rb‘) as f:
img = f.read()
except FileNotFoundError:
return None, 404
# 4. 自定义响应
resp = make_response(img)
# 5. 声明响应体的类型 为 图片
resp.headers[‘Content-Type‘] = ‘image/png‘ 注意图片格式
# 6. 返回响应
return resp
欧克
原文:https://www.cnblogs.com/asdn/p/14865399.html