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和GO语言实现的消息摘要算法示例
Mar 10 Python
详解python的webrtc库实现语音端点检测
May 31 Python
python文本数据相似度的度量
Mar 12 Python
python中使用ctypes调用so传参设置遇到的问题及解决方法
Jun 19 Python
python多线程http压力测试脚本
Jun 25 Python
python3 pillow模块实现简单验证码
Oct 31 Python
基于python cut和qcut的用法及区别详解
Nov 22 Python
使用遗传算法求二元函数的最小值
Feb 11 Python
Django模板之基本的 for 循环 和 List内容的显示方式
Mar 31 Python
Python urllib库如何添加headers过程解析
Oct 05 Python
详解Python调用系统命令的六种方法
Jan 28 Python
Python Numpy库的超详细教程
Apr 06 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
四月新番又没了,《Re:从零开始的异世界生活》第二季延期至7月播出
2020/05/06 日漫
PHP操作文件方法问答
2007/03/16 PHP
PHP iconv 函数转gb2312的bug解决方法
2009/10/11 PHP
ThinkPHP模板范围判断输出In标签与Range标签用法详解
2014/06/30 PHP
调试PHP程序的多种方法介绍
2014/11/06 PHP
利用PHP获取访客IP、地区位置、浏览器及来源页面等信息
2017/06/27 PHP
Firefox和IE浏览器兼容JS脚本写法小结
2008/07/07 Javascript
写js时遇到的一些小问题
2010/12/06 Javascript
基于jquery打造的百分比动态色彩条插件
2012/09/19 Javascript
chrome浏览器不支持onmouseleave事件的解决技巧
2013/05/31 Javascript
jQuery extend 的简单实例
2013/09/18 Javascript
文本框水印提示效果的简单实现代码
2014/02/22 Javascript
微信小程序 配置文件详细介绍
2016/12/14 Javascript
Vue.js实战之使用Vuex + axios发送请求详解
2017/04/04 Javascript
JS实现汉字与Unicode码相互转换的方法详解
2017/04/28 Javascript
详解vuejs之v-for列表渲染
2017/06/22 Javascript
angular.js4使用 RxJS 处理多个 Http 请求
2017/09/23 Javascript
vue3.0 CLI - 3.2 路由的初级使用教程
2018/09/20 Javascript
vue+vuex+json-seiver实现数据展示+分页功能
2019/04/11 Javascript
Vue.js页面中有多个input搜索框如何实现防抖操作
2019/11/04 Javascript
纯JS开发baguetteBox.js响应式画廊插件
2020/06/28 Javascript
JavaScript实现下拉列表
2021/01/20 Javascript
python实现查找两个字符串中相同字符并输出的方法
2015/07/11 Python
在Python的Django框架的视图中使用Session的方法
2015/07/23 Python
python数字图像处理之骨架提取与分水岭算法
2018/04/27 Python
解决Django中修改js css文件但浏览器无法及时与之改变的问题
2019/08/31 Python
利用PyCharm操作Github(仓库新建、更新,代码回滚)
2019/12/18 Python
HTML5实现可缩放时钟代码
2017/08/28 HTML / CSS
英国设计师泳装、沙滩装和比基尼在线精品店:Beach Cafe
2019/08/28 全球购物
在职人员函授期间自我评价分享
2013/11/08 职场文书
周年庆典邀请函范文
2014/01/24 职场文书
促销活动总结怎么写
2014/06/25 职场文书
发展党员工作情况汇报
2014/10/28 职场文书
2015最新民情日记范文
2015/06/26 职场文书
不知如何爱孩子,这些方法教会您
2019/08/06 职场文书
Python集合的基础操作
2021/11/01 Python