Django博客优化 mdeditor上传图片到七牛云

前言

当你写博客上传图片时,一定会为自己服务器空间被过多占用心生烦恼,你肯定不想本来就捉襟见肘的空间被大量图片所占用.
大部分网站都会选择把静态资源单独放置于对象存储中单独管理,这样不仅提升了服务器空间利用率,也一定程度上提供了安全保证,更能提高网站访问速度!

当前网络上有很多配置方案,但是更多都是使用七牛云作为网站图床使用. 因为七牛云会提供新用户每月10G上传图片的免费空间,当然你也可以选择其他服务商提供的对象存储服务,但具体优惠情况还要自己探究.

本篇文章主要记录我自己写的博客网站后台使用mdeditor编辑器配合七牛云完成图片上传的主要操作!

一. 配置mdeditor

安装配置

pip install django-mdeditor -i https://pypi.douban.com/simple

注册为应用

INSTALLED_APPS = [
    ...
    'mdeditor',
]

在 settings 中添加媒体文件的路径配置:

MEDIA_ROOT = os.path.join(BASE_DIR, 'media')
MEDIA_URL = '/media/'

注意:django3中X_FRAME_OPTIONS 默认为 deny.如果你使用的是django3要在settings中添加X_FRAME_OPTIONS = 'SAMEORIGIN',否则会出现跨域问题,导致图片上传后无法预览等问题!

添加扩展url和媒体文件url

from django.conf.urls import include
from django.contrib import admin
from django.urls import path

urlpatterns = [
....
    path('mdeditor/', include(('mdeditor.urls', 'mdeditor'), namespace='mdeditor')), # 配置编辑器路由
    re_path(r'^media/(?P<path>.*)$', serve, {'document_root': MEDIA_ROOT}), #添加上传文件路径
....

修改models.py里需要使用编辑器渲染的字段

body = MDTextField(verbose_name='文章内容')

迁移数据库并注册入admin中, 再次运行程序即可使用markdown编辑器

测试使用编辑器上传图片,观察图片是否可正常查看与预览,此处略

参考配置文档

二. 注册七牛云

注册没什么难度,只要按照要求即可顺利完成注册,七牛地址
记得实名认证!

创建存储空间

主要操作步骤:
进入七牛选择产品-->对象存储-->空间管理-->新建空间-->配置存储空间信息

  • 选择对象存储


    image.png
  • 新建空间


    image.png
  • 配置空间信息


    image.png

空间建议选择公开,后面传图片访问时不会报错!

使用七牛云SDK

要使用七牛云官方已给出完整的SDK文档
参考文档

安装

pip install qiniu

新增settings关于七牛云的配置

Access_Key = '你的Access_Key '
Secret_Key = '你的Secret_Key'
QINIU_URL_DOMAIN = 'xxxx.com' # 首次注册七牛云的用户,官方会提供一个30天的测试域名使用

封装七牛上传图片函数

在项目中创建utils目录,并创建qiniu.py文件用于封装函数

# -*- coding: utf-8 -*-
# flake8: noqa
import datetime

from qiniu import Auth, put_file, etag, put_data
import qiniu.config
#需要填写你的 Access Key 和 Secret Key
from run.settings import Access_Key, Secret_Key, QINIU_URL_DOMAIN

access_key = Access_Key
secret_key = Secret_Key
qiniu_url_domain = QINIU_URL_DOMAIN
# 为了显示图片类型,传入mdeditor源码中类型参数
def storage(file_data, file_extension):
    '''
    上传图片到七牛
    '''
    #构建鉴权对象
    q = Auth(access_key, secret_key)
    #要上传的空间
    bucket_name = 'wsmzao'
    #上传后保存的文件名(借鉴mdeditor源码设置图片名称)
    key = '%s.%s' % ('{0:%Y%m%d%H%M%S%f}'.format(datetime.datetime.now()),
                                       file_extension)
    #生成上传 Token,可以指定过期时间等
    token = q.upload_token(bucket_name, key, 3600)
    #要上传文件的本地路径
    # localfile = './sync/bbb.jpg'
    ret, info = put_data(token, key, file_data)
  # 最终返回显示链接
    if info.status_code == 200:
        base_url = 'http://%s/%s' % (qiniu_url_domain, ret.get("key"))
        return base_url
    else:
        raise Exception("上传七牛失败")

if __name__ == '__main__':
    storage()

# 可通过本地图片测试上传
#if __name__ == '__main__':
#       with open("本地上传图片.jpg", "rb") as f:
#      file_data = f.read()
#       storage(file_data)

先使用本地图片测试一下是否可正常传入七牛云,然后再做调整与修改

修改mdeditor上传函数

观察mdeditor源码,对保存图片处使用刚刚封装的七牛函数做替换

# -*- coding:utf-8 -*-
import os
import datetime

from django.views import generic
from django.conf import settings
from django.http import JsonResponse
from django.views.decorators.csrf import csrf_exempt
from django.utils.decorators import method_decorator
from .configs import MDConfig
from django.views.decorators.clickjacking import xframe_options_exempt, xframe_options_sameorigin
from django.views.decorators.csrf import csrf_exempt
from utils.qiniu import storage
# TODO 此处获取default配置,当用户设置了其他配置时,此处无效,需要进一步完善
MDEDITOR_CONFIGS = MDConfig('default')


class UploadView(generic.View):
    """ upload image file """

    @method_decorator(csrf_exempt)
    def dispatch(self, *args, **kwargs):
        return super(UploadView, self).dispatch(*args, **kwargs)

    def post(self, request, *args, **kwargs):
        
        upload_image = request.FILES.get("editormd-image-file", None)
        # media_root = settings.MEDIA_ROOT

        # image none check
        if not upload_image:
            return JsonResponse({
                'success': 0,
                'message': "未获取到要上传的图片",
                'url': ""
            })

        # image format check
        file_name_list = upload_image.name.split('.')
        # list.pop(-1)表示列表最后一个值
        file_extension = file_name_list.pop(-1)
        file_name = '.'.join(file_name_list)
        if file_extension not in MDEDITOR_CONFIGS['upload_image_formats']:
            return JsonResponse({
                'success': 0,
                'message': "上传图片格式错误,允许上传图片格式为:%s" % ','.join(
                    MDEDITOR_CONFIGS['upload_image_formats']),
                'url': ""
            })
        # save image
        file_data = upload_image.read()
        # 调用七牛云上传
        base_url = storage(file_data, file_extension)

        return JsonResponse({'success': 1,
                             'message': "上传成功!",
                             'url': base_url
                             })

最终效果展示:

image.png

如果你有自己的域名,建议直接改为自己的域名,这对于你应该没有什么难度!

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,233评论 4 360
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,013评论 1 291
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,030评论 0 241
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,827评论 0 204
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,221评论 3 286
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,542评论 1 216
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,814评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,513评论 0 198
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,225评论 1 241
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,497评论 2 244
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 31,998评论 1 258
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,342评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 32,986评论 3 235
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,055评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,812评论 0 194
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,560评论 2 271
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,461评论 2 266

推荐阅读更多精彩内容