Flask 图片对应

Posted 罗万

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Flask 图片对应相关的知识,希望对你有一定的参考价值。

flask与django最大的区别是flask需要自己手动写入对应项 而django是自己准备号了对应的包 添加图片
对应模型类
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

欧克

以上是关于Flask 图片对应的主要内容,如果未能解决你的问题,请参考以下文章

Flask 上传图片并灰度显示

根据图片的url地址下载图片到本地保存代码片段

Flask 编写http接口api及接口自动化测试

12_关于flask中的宏

Flask之模板之宏继承包含

CardView 不在披萨片段中显示图片