flask多圖片儲存優化

前言

在後端開發時,咱們會常常遇到這樣的需求,一個字段要儲存多張圖片,以下:前端

image

通常狀況咱們會想到的是:
新建一張表,以一對多的方式進行儲存。可是這樣咱們就會面臨一系列問題:python

  • 寫入時: 麻煩。
  • 修改時: 檢查修改去替換,或把對應id下的圖片刪除再從新寫入。
  • 查詢時: 到圖片表查找對應圖片。
  • 關聯數據刪除時: 要刪除關聯屬性下對應的圖片。

增刪查改都會遇到一系列的問題,那要逐條去解決嗎?其實你僅須要兩行python代碼。數據庫

解決方案

在前端兩年工做經驗告訴我:這種狀況用數組(也就是字典)增刪查改最方便,因此沒必要擔憂前端用不了的問題json

可是數據庫存不了字典,因此咱們要作的只有兩步:flask

  1. 把接收到的字典轉成str類型,存進對應的字段裏面
  2. 把庫裏取到的str轉成字典,返回給前端

你說管理另外一張表有點麻煩,那我管理你一個區區的字符串還不是垂手可得嗎?
這樣作有以下優點:後端

  • 寫入時:把它當成一個str寫入
  • 修改時:直接覆蓋str
  • 查詢時:不須要找表,只須要把str轉成字典返回給前端
  • 關聯數據刪除時:不須要考慮任何事情

兩行代碼解決四個問題,同時少管理了一張表api

image

案例

一個新增接口。
@api.route("/role/add",methods=["POST"])
@login_required
@power_filter
def roleAdd():
    ''' 新增角色 :return:狀態 '''
    
    res_dir = request.get_json()
    if res_dir is None:
        return jsonify(code=RET.PARAMERR,msg="未接收到參數")
        
    name = res_dir.get("name")
    head_portrait = res_dir.get("head_portrait")
    gender = res_dir.get("gender")
    age = res_dir.get("age")
    attribute = res_dir.get("attribute")
    site = res_dir.get("site")
    intro = res_dir.get("intro")
    image_list = res_dir.get("image_list")

    if not all([name,head_portrait,gender,attribute,site]):
        return jsonify(code=RET.PARAMERR,msg="缺乏參數")
    
    #若是前端一張圖片都沒上傳,就儲存一個空字符
    imgStr = ''
    if len(image_list) > 0:
        #若是上傳了,就把圖片轉成str而後儲存在對應的字段裏
        imgStr = ",".join(image_list)

    role = Role(name=name,head_portrait=head_portrait,gender=gender,age=age,attribute=attribute,site=site,intro=intro,image_list=imgStr)

    try:
        db.session.add(role)
        db.session.commit()
    except Exception as e:
        db.session.rollback()
        current_app.logger.error(e)
        return jsonify(code=RET.DATAERR,msg="添加失敗")

    return jsonify(code=RET.OK,msg="添加成功")
複製代碼

看看儲存效果:數組

image

記得要把這個字段的儲存字符設置大一點,我這裏最多儲存四張,因此給了280*4bash

image_list = db.Column(db.String(280 * 4), default="")  # 最多4張圖片
複製代碼
一個詳情接口
@api.route("/role/detail/<int:id>")
def roleDetail(id):
    ''' 角色詳情 :param id: :return: '''
    role = Role.query.get(id)
    if role is None:
        return jsonify(code=RET.DATAERR,msg="未查找到數據")

    #角色屬性
    attribute = Role.getAttr(id)
    #角色地區
    site = Role.getSite(id)

    data = {
        "id":role.id,
        "name":role.name,
        "head_portrait":role.head_portrait,
        "gender":role.gender,
        "age":role.age,
        "site":site,
        "intro":role.intro,
        "image_list":role.image_list.split(","),#重點在這
        "attribute":attribute
    }

    return jsonify(code=RET.OK,data=data)
複製代碼

看看返回效果 session

image

相關flask文章

flask 實現token機制

相關文章
相關標籤/搜索