django 配置阿里云OSS存储media文件的例子


Posted in Python onAugust 20, 2019

1. 安装django-aliyun-oss2-storage包

linux上用 pip install django-aliyun-oss2-storage 无报错,顺利安装

windows上报错:

(python3_sbs) F:\projects\virtualenv\python3_sbs\Scripts>pip install django-aliyun-oss2-storage
Collecting django-aliyun-oss2-storage
 Using cached django-aliyun-oss2-storage-0.1.5.tar.gz
 Complete output from command python setup.py egg_info:
 Traceback (most recent call last):
  File "<string>", line 1, in <module>
  File "C:\Users\super\AppData\Local\Temp\pip-build-pb4u0qtw\django-aliyun-oss2-storage\setup.py", line 5, in <module>
  README = readme.read()
 UnicodeDecodeError: 'gbk' codec can't decode byte 0x91 in position 63: illegal multibyte sequence
 
 ----------------------------------------
Command "python setup.py egg_info" failed with error code 1 in C:\Users\super\AppData\Local\Temp\pip-build-pb4u0qtw\django-aliyun-oss2-storage\

解决方法:

1. 下载源码 django-aliyun-oss2-storage-0.1.5.tar.gz 地址: https://github.com/xiewenya/django-aliyun-oss2-storage

2. 解压进入解压后的文件夹

3. 打开README.md 删除所有内容

4. 安装

python setup.py install

2. 设置setting.py

ACCESS_KEY_ID = "xxxx"
 ACCESS_KEY_SECRET = "xxxx"
 END_POINT = "oss-cn-beijing.aliyuncs.com"
 PREFIX_URL = 'http://'
 BUCKET_NAME = "xxx"
 ALIYUN_OSS_CNAME = "" # 自定义域名,如果不需要可以不填写
 BUCKET_ACL_TYPE = "public-read" # private, public-read, public-read-write
 DEFAULT_FILE_STORAGE = 'aliyun_oss2_storage.backends.AliyunMediaStorage'
 MEDIA_URL = '/media/'
 MEDIA_ROOT = "media"

顺便提一下,当在xadmin后台上传文件, filename的时候,文件会上传到路径

PREFIX_URL + BUCKET_NAME+"."END_POINT+MEDIA_URL+filename

但是在django 模板渲染html的时候,我们取filename是按照格式:

<img src="{{ MEDIA_URL }}{{ object.image }}"

前端html render出来后,其实看到的路径是:

<img src="/media/image/2017/12/timg.jpg"

根本取不到阿里云服务器上的文件。所以需要设置个新的变量,如 ALI_MEDIA_URL在模板渲染的时候替换MEDIA_URL.

方法:

1. 创建新文件my_processor.py

from __future__ import unicode_literals
 
import itertools
 
from django.conf import settings
from django.middleware.csrf import get_token
from django.utils.encoding import force_text
from django.utils.functional import SimpleLazyObject, lazy
 
def ali_media(request):
 """
 Adds media-related context variables to the context.
 """
 return {'ALI_MEDIA_URL': settings.ALI_MEDIA_URL}

2. setting.py中

ALI_MEDIA_URL = PREFIX_URL + BUCKET_NAME + "." + END_POINT + '/media/'
 
TEMPLATES = [
 {
  'BACKEND': 'django.template.backends.django.DjangoTemplates',
  'DIRS': [os.path.join(BASE_DIR, 'templates')],
  'APP_DIRS': True,
  'OPTIONS': {
   'context_processors': [
    'django.template.context_processors.debug',
    'django.template.context_processors.request',
    'django.contrib.auth.context_processors.auth',
    'django.contrib.messages.context_processors.messages',
    'django.template.context_processors.media',
    'utils.sbs_processor.ali_media',
   ],
  },
 },
]

3. 在模板中设置为:

<img src="{{ ALI_MEDIA_URL }}{{ object.image }}"

3. 设置uediitor

在DjangoUeditor/view.py中

之前存储到本地的代码是:

# 保存上传的文件
def save_upload_file(PostFile, FilePath):
 try:
  f = open(FilePath, 'wb')
  for chunk in PostFile.chunks():
   f.write(chunk)
 except Exception as e:
  f.close()
  return u"写入文件错误:%s" % e
 f.close()
 return u"SUCCESS"

我们模仿这个写一个上传到阿里云:

#保存上传文件到aliyun
def save_upload_file_to_aliyun(PostFile, Outputfile):
 access_key = ACCESS_KEY_ID
 secret_key = ACCESS_KEY_SECRET
 bucket_name = BUCKET_NAME
 try:
  import oss2
  auth = oss2.Auth(access_key, secret_key)
  bucket = oss2.Bucket(auth, END_POINT, bucket_name)
  # ret, info = put_file(token, key, upload_file)
  result=bucket.put_object(Outputfile, PostFile)
  return u"SUCCESS"
  # if ret.get('key',None) == None:
  #  raise Exception('upload error')
  # else:
  #  return u"SUCCESS"
 except Exception as e:
  print(str(e))
  return str(e)

在哪调用呢? 找到:

state = save_upload_file(file, os.path.join(OutputPath, OutputFile))

替换成:

state = save_upload_file_to_aliyun(file, OutputPathFormat)

配置结束。ueditor和xadmin上传的图片都会上传到阿里云oss中

以上这篇django 配置阿里云OSS存储media文件的例子就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python中使用items()方法返回字典元素对的教程
May 21 Python
Python字符串拼接的几种方法整理
Aug 02 Python
Python科学计算包numpy用法实例详解
Feb 08 Python
Python3实现的字典、列表和json对象互转功能示例
May 22 Python
python实现决策树ID3算法的示例代码
May 30 Python
pycharm安装和首次使用教程
Aug 27 Python
Matplotlib中文乱码的3种解决方案
Nov 15 Python
python 获取等间隔的数组实例
Jul 04 Python
python基于三阶贝塞尔曲线的数据平滑算法
Dec 27 Python
python中安装django模块的方法
Mar 12 Python
使用Tensorflow-GPU禁用GPU设置(CPU与GPU速度对比)
Jun 30 Python
Python爬取数据并实现可视化代码解析
Aug 12 Python
python数据类型之间怎么转换技巧分享
Aug 20 #Python
python并发编程多进程之守护进程原理解析
Aug 20 #Python
python控制台实现tab补全和清屏的例子
Aug 20 #Python
关于python字符串方法分类详解
Aug 20 #Python
python+tkinter实现学生管理系统
Aug 20 #Python
Python对列表的操作知识点详解
Aug 20 #Python
python中的global关键字的使用方法
Aug 20 #Python
You might like
PHP5+UTF8多文件上传类
2008/10/17 PHP
PHP中批量生成静态html(命令行下运行PHP)
2014/04/19 PHP
PHP实现随机生成水印图片功能
2017/03/22 PHP
PHP 多进程与信号中断实现多任务常驻内存管理实例方法
2019/10/04 PHP
Jquery 基础学习笔记
2009/05/29 Javascript
jQuery Ajax之$.get()方法和$.post()方法
2009/10/12 Javascript
为指定元素增加样式的js代码
2009/12/09 Javascript
js动态在form上插入enctype=multipart/form-data的问题
2012/05/24 Javascript
JavaScript中getUTCSeconds()方法的使用详解
2015/06/11 Javascript
浅谈JavaScript异常处理语句
2015/06/26 Javascript
利用HTML5的画布Canvas实现刮刮卡效果
2015/09/06 Javascript
js前端日历控件(悬浮、拖拽、自由变形)
2017/03/02 Javascript
原生JS实现自定义滚动条效果
2020/10/27 Javascript
微信禁止下拉查看URL的处理方法
2017/09/28 Javascript
vue实现微信分享朋友圈,发送朋友的示例讲解
2018/02/10 Javascript
JS逻辑运算符短路操作实例分析
2018/07/09 Javascript
微信小程序时间选择插件使用详解
2018/12/28 Javascript
vue使用代理解决请求跨域问题详解
2019/07/24 Javascript
vue之组件内监控$store中定义变量的变化详解
2019/11/08 Javascript
Node.JS获取GET,POST数据之queryString模块使用方法详解
2020/02/06 Javascript
微信小程序个人中心的列表控件实现代码
2020/04/26 Javascript
vue+iview实现分页及查询功能
2020/11/17 Vue.js
python查看微信好友是否删除自己
2016/12/19 Python
python 设置xlabel,ylabel 坐标轴字体大小,字体类型
2019/07/23 Python
tensorflow自定义激活函数实例
2020/02/04 Python
请编写一个 C 函数,该函数在给定的内存区域搜索给定的字符,并返回该字符所在位置索引值
2014/09/15 面试题
什么是跨站脚本攻击
2014/12/11 面试题
老公给老婆的道歉信
2014/01/10 职场文书
西式结婚主持词
2014/03/14 职场文书
环保倡议书100字
2014/05/15 职场文书
商务经理岗位职责
2014/07/30 职场文书
学生打架检讨书
2014/10/20 职场文书
中学生自我评价2015
2015/03/03 职场文书
考研导师推荐信范文
2015/03/27 职场文书
离婚答辩状范文
2015/05/22 职场文书
关于Oracle12C默认用户名system密码不正确的解决方案
2021/10/16 Oracle