在Django中把Base64字符串保存為ImageField

在數據model中使用ImageField來管理avatar。

class User(models.Model):AVATAR_COLORS = (('#212736', 'Black'),('#2161FD', 'Blue'),('#36B37E', 'Green'),('#F5121D', 'Red'),('#FE802F', 'Orange'),('#9254DE', 'Purple'),('#EB2F96', 'Magenta'),)def generate_filename(self, filename):url = "avatar-{}-{}".format(self.user.username, filename)return urlavatar = models.ImageField(upload_to=generate_filename, verbose_name='頭像', null=True, blank=True)avatar_color = models.CharField(verbose_name='頭像顏色', choices=AVATAR_COLORS, max_length=10, blank=True, null=True)#這里省略其他字段

前端avatar字段傳輸的是Base64字符串,Django后端將其轉換為ContentFile后進行save。

首先,確保你已經安裝了Pillow庫,它是Django中處理圖像的常用庫。

import base64
import binascii
import imghdr
import io
import uuidfrom django.core.exceptions import ValidationError
from django.core.files.base import ContentFileclass Base64ToImageFile(object):"""A django-rest-framework field for handling image-uploads through raw post data.It uses base64 for en-/decoding the contents of the file."""ALLOWED_TYPES = ("jpeg","jpg","png","gif")EMPTY_VALUES = (None, '', [], (), {})INVALID_FILE_MESSAGE = "Please upload a valid image."INVALID_TYPE_MESSAGE = "The type of the image couldn't be determined."def to_file(self, base64_data):# Check if this is a base64 stringif base64_data in self.EMPTY_VALUES:return Noneif isinstance(base64_data, str):# Strip base64 header.if ';base64,' in base64_data:header, base64_data = base64_data.split(';base64,')# Try to decode the file. Return validation error if it fails.try:decoded_file = base64.b64decode(base64_data)except (TypeError, binascii.Error, ValueError):raise ValidationError(self.INVALID_FILE_MESSAGE)# Generate file name:file_name = self.get_file_name(decoded_file)# Get the file name extension:file_extension = self.get_file_extension(file_name, decoded_file)if file_extension not in self.ALLOWED_TYPES:raise ValidationError(self.INVALID_TYPE_MESSAGE)complete_file_name = file_name + "." + file_extensiondata = ContentFile(decoded_file, name=complete_file_name)return dataraise ValidationError('Invalid type. This is not an base64 string: {}'.format(type(base64_data)))def get_file_name(self, decoded_file):return str(uuid.uuid4())def get_file_extension(self, filename, decoded_file):try:from PIL import Imageexcept ImportError:raise ImportError("Pillow is not installed.")extension = imghdr.what(filename, decoded_file)# Try with PIL as fallback if format not detected due# to bug in imghdr https://bugs.python.org/issue16512if extension is None:try:image = Image.open(io.BytesIO(decoded_file))except (OSError, IOError):raise ValidationError(self.INVALID_FILE_MESSAGE)extension = image.format.lower()extension = "jpg" if extension == "jpeg" else extensionreturn extensiondef base64_string_to_file(base64_string):return Base64ToImageFile().to_file(base64_string)

在創建用戶過程中,給avatar字段賦值ContentFile類型

        avatar_file = base64_string_to_file(avatar_string)if avatar_file:request_data["avatar"] = avatar_fileelse:request_data.pop('avatar', None)serializer = UserCreateSerializer(data=request_data)if serializer.is_valid():user = serializer.save()

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/84541.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/84541.shtml
英文地址,請注明出處:http://en.pswp.cn/web/84541.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

使用 R 處理圖像

在 R 中進行圖像處理,使用像 imager 這樣的包,可以實現強大的數字圖像分析和處理。本博客將基于"圖像數據分析"文檔的概念,演示使用 imager 包進行的關鍵技術——圖像增強、去噪和直方圖均衡化,并通過可視化結果展示這些…

一命速通Prometheus+Grafana+Consul+VictoriaMetrics

Prometheus業務 搭建及使用 注意:優先看完提供的博客鏈接,可以快速了解該工具的功能及其搭建和使用。 prometheusgrafana 一、PrometheusGrafana普羅米修斯,搭建和使用_普羅米修斯 grafana-CSDN博客 ./prometheus --config.fileprometheus.ym…

螞蟻百寶箱快速創建智能體AI小程序

螞蟻百寶箱官網https://tbox.alipay.com/community?operationSource1006/ 以下是一篇關于螞蟻百寶箱快速創建智能體 AI 小程序的圖文并茂的博客: 標題:螞蟻百寶箱快速創建智能體 AI 小程序,開啟智能應用新體驗 引言 在數字化飛速發展的當…

大模型面試題:RL Scaling Law 中的“過優化”現象及其緩解方法是啥?

更多面試題,請看 大模型面試題總結-CSDN博客 或者 https://gitee.com/lilitom/ai_interview_questions/blob/master/README.md 最好將URL復制到瀏覽器中打開,不然可能無法直接打開 ---------------------------------------------------------------…

Filecoin系列 - IPLD 技術分析

1. 用途 1.1 存儲數據 為了成功地將數據加到 Filecoin 網絡, 需要成功完成以下步驟: 客戶端導入數據生成CAR文件: 數據必須打包成 CAR file (內容可尋址檔案) - CAR是IPLD規范的序列化歸檔文件.存儲交易: 存儲供應商和客戶之間的存儲交易必須由客戶發起, 并由存儲供應商接受…

Apptrace如何幫我精準追蹤移動廣告效果?

開發者視角:Apptrace如何幫我精準追蹤移動廣告效果??? 作為獨立開發者,我最頭疼的就是?“廣告投放到底有沒有用?”?——錢花出去了,用戶是刷量機器人還是真實用戶?哪個渠道的ROI最高?Apptr…

【MySQL篇07】:redo log日志與buffer pool詳解

文章目錄 1. Buffer Pool 緩沖池2. redo log (重做日志)redo log 的作用:為什么需要 redo log buffer?什么時候刷盤呢? 3. 總結一下 redo log 和 Buffer Pool 在更新數據時的協同工作關鍵組件關系圖刷盤完成后 1. Buffer Pool 緩沖池 首先&a…

Qt Library庫系列----Serial串口

前言 每次寫串口相關的功能時,總是需要重新寫或者復制原來寫過的文件,容易出錯不說,這也不是碼農的風格,所以還是得有一套自己得代碼庫,方便調用,又能保持神秘感。 一、開發需求 1.有個實例類;…

第八節:Vben Admin 最新 v5.0 (vben5) 快速入門 - 用戶管理(下)

Vben5 系列文章目錄 ?? 基礎篇 ? 第一節:Vben Admin 最新 v5.0 (vben5) 快速入門 ? 第二節:Vben Admin 最新 v5.0 (vben5) 快速入門 - Python Flask 后端開發詳解(附源碼) ? 第三節:Vben Admin 最新 v5.0 (vben5) 快速入門 - 對接后端登錄接口(上) ? 第四節:Vben Ad…

Redis 性能瓶頸時如何處理?

當 Redis 遇到性能瓶頸時,需要從多個維度進行排查和優化。以下是系統化的解決方案,涵蓋硬件、配置、數據模型、網絡等關鍵點: 一、硬件資源優化 內存瓶頸 現象:頻繁觸發 OOM 或 used_memory 接近物理內存。解決: 升級服…

多相機三維人臉掃描儀:超寫實數字人模型制作“加速器”

超寫實數字人,又稱“數字分身”,是以真人形象為原型構建的高仿真虛擬形象,按維度可分為2D數字人與3D數字人。這類數字人已廣泛應用于影視制作、游戲交互、品牌直播等場景,其核心價值在于通過技術手段實現真人形象的數字化復刻&…

ceph 自動調整 pg_num

要讓 Ceph 的 pool 自動調整 pg_num(PG 數量),你需要啟用 PG autoscaler。這是從 Ceph Octopus(15.x) 開始引入的功能,能根據池的容量和對象數量自動建議或調整 pg_num,以實現負載均衡。 ? 一步步開啟 Pool 的 pg_num 自動調整 1. 啟用 PG autoscaler 模塊(通常默認啟…

Python Beautiful Soup 4【HTML/XML解析庫】 簡介

全面剖析大模型 圖解大模型:生成式AI原理與實戰 大語言模型大模型應用開發Transformer DeepSeek模型原理開發深度學習 圖靈出品 大模型強化學習詳解 大模型算法:強化學習、微調與對齊(全彩)詳解強化學習 RLHF GRPO DPO SFT CoT D…

AI Agent開發與安全

AI Agent的核心演進 Level 1:LLM Agent(聊天機器人) 特點:靠提示詞工程賦予人設(如星座占卜、角色扮演),但存在幻覺問題,輸出不可控。局限:娛樂性強,難勝任嚴…

NumPy玩轉數據科學

本文在創作過程中借助 AI 工具輔助資料整理與內容優化。圖片來源網絡。 文章目錄 一、引言二、NumPy 概述2.1 NumPy 的定義與發展2.2 NumPy 的重要性 三、NumPy 的多維數組支持3.1 多維數組的概念3.2 多維數組的創建與操作3.2.1 數組的創建3.2.2 數組的索引和切片3.2.3 數組的運…

【uniapp小程序開發】圖表組件ucharts的使用(入門)

一、插件的安裝 安裝非常簡單,打開uniapp的插件市場,導入到項目中即可 下載地址:https://ext.dcloud.net.cn/plugin?id271 二、開始實踐 先看頁面的效果 頁面中實現了三個基本圖形的展示:折線圖、餅圖和柱狀圖。 上圖左一&a…

APISIX+etcd高可用集群部署方案詳解

#作者:任少近 文章目錄 一、背景二、部署etcd1、etcd的svc部署yaml2、Etcd 服務定義說明3、etcd的statefulset部署yaml4、Etcd 狀態集(StatefulSet)配置說明5、查看集群狀態 三、部署apisix的deployment部署1、apisix部署yaml文件2、APISIX …

Excel常用公式大全

資源寶整理分享:https://www.httple.net Excel常用公式大全可以幫助用戶提高工作效率,掌握常用的Excel公式,讓數據處理和計算工作更加便捷高效。了解公式學習方法、用途,不再死記硬背,拒絕漫無目的。 命令用途注釋說…

什么是Seata?

深入解析Seata:分布式事務的終極解決方案 什么是Seata? Seata(Simple Extensible Autonomous Transaction Architecture)是一款開源的分布式事務解決方案,由阿里巴巴中間件團隊于2019年1月發起并開源(最初…

【系統規劃與管理師第二版】1.3 新一代信息技術及發展

一、物聯網 物聯網(IoT)是指通過信息傳感設備,按約定的協議將任何物品與互聯網相連接,進行信息交換和通信,以實現智能化識別、定位、跟蹤、監控和管理的網絡。物聯網主要解決物品與物品(T2T)、人…