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学习笔记_数据排序方法
May 22 Python
Python网络编程中urllib2模块的用法总结
Jul 12 Python
使用python绘制常用的图表
Aug 27 Python
Python中getpass模块无回显输入源码解析
Jan 11 Python
TensorFlow变量管理详解
Mar 10 Python
从请求到响应过程中django都做了哪些处理
Aug 01 Python
python实现倒计时小工具
Jul 29 Python
python实现知乎高颜值图片爬取
Aug 12 Python
在flask中使用python-dotenv+flask-cli自定义命令(推荐)
Jan 05 Python
如何基于Python + requests实现发送HTTP请求
Jan 13 Python
使用Django清空数据库并重新生成
Apr 03 Python
Python装饰器结合递归原理解析
Jul 02 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
浅析php中三个等号(===)和两个等号(==)的区别
2013/08/06 PHP
php遍历类中包含的所有元素的方法
2015/05/12 PHP
jMessageBox 基于jQuery的窗口插件
2009/12/09 Javascript
javascript window.opener的用法分析
2010/04/07 Javascript
Jquery中的CheckBox、RadioButton、DropDownList的取值赋值实现代码
2011/10/12 Javascript
纯javascript模仿微信打飞机小游戏
2015/08/20 Javascript
JS实现旋转木马式图片轮播效果
2017/01/18 Javascript
JS中的作用域链
2017/03/01 Javascript
浅谈struts1 &amp; jquery form 文件异步上传
2017/05/25 jQuery
javascript获取图片的top N主色值方法详解
2018/01/26 Javascript
JS解析后台返回的JSON格式数据实例
2018/08/06 Javascript
解决JQuery的ajax函数执行失败alert函数弹框一闪而过问题
2019/04/10 jQuery
Easyui 关闭jquery-easui tab标签页前触发事件的解决方法
2019/04/28 jQuery
jQuery实现高级检索功能
2019/05/28 jQuery
Vue组件模板及组件互相引用代码实例
2020/03/11 Javascript
python数据类型_字符串常用操作(详解)
2017/05/30 Python
python3 读写文件换行符的方法
2018/04/09 Python
python保存文件方法小结
2018/07/27 Python
python 列表中[ ]中冒号‘:’的作用
2019/04/30 Python
python常用库之NumPy和sklearn入门
2019/07/11 Python
html5实现输入框fixed定位在屏幕最底部兼容性
2020/07/03 HTML / CSS
Born鞋子官网:Born Shoes
2017/04/06 全球购物
澳大利亚先进的皮肤和激光诊所购物网站:Soho Skincare
2018/10/15 全球购物
公司出纳岗位职责
2013/12/07 职场文书
跟单文员岗位职责
2014/01/03 职场文书
《老王》教学反思
2014/02/23 职场文书
服装设计专业毕业生求职信
2014/04/09 职场文书
项目建议书怎么写
2014/05/15 职场文书
美术第二课堂活动总结
2014/07/08 职场文书
授权委托书
2014/09/17 职场文书
乡党政领导班子群众路线教育实践活动个人对照检查材料
2014/09/20 职场文书
2016党员学习《反对自由主义》心得体会
2016/01/22 职场文书
2019年XX公司的晨会制度及流程!
2019/07/23 职场文书
JavaScript严格模式不支持八进制的问题讲解
2021/11/07 Javascript
详解Flutter自定义应用程序内键盘的实现方法
2022/06/14 Java/Android
Go调用Rust方法及外部函数接口前置
2022/06/14 Golang