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操作gmail实例
Jan 14 Python
使用Python中的tkinter模块作图的方法
Feb 07 Python
python 生成器协程运算实例
Sep 04 Python
Python实现二维数组按照某行或列排序的方法【numpy lexsort】
Sep 22 Python
python实现csv格式文件转为asc格式文件的方法
Mar 23 Python
Python3爬虫之urllib携带cookie爬取网页的方法
Dec 28 Python
Python3.4学习笔记之类型判断,异常处理,终止程序操作小结
Mar 01 Python
python中eval与int的区别浅析
Aug 11 Python
Python +Selenium解决图片验证码登录或注册问题(推荐)
Feb 09 Python
Python实现名片管理系统
Feb 14 Python
什么是python的列表推导式
May 26 Python
Python接口自动化系列之unittest结合ddt的使用教程详解
Feb 23 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 工厂模式使用方法
2010/05/18 PHP
PHP常用代码大全(新手入门必备)
2010/06/29 PHP
php入门学习知识点八 PHP中for循环基本应用之九九乘法口绝表
2011/07/14 PHP
PHP封装的多文件上传类实例与用法详解
2017/02/07 PHP
JS动态添加option和删除option(附实例代码)
2013/04/01 Javascript
JQuery表格内容过滤的实现方法
2013/07/05 Javascript
jQuery实现为控件添加水印文字效果(附源码)
2015/12/02 Javascript
jquery中cookie用法实例详解(获取,存储,删除等)
2016/01/04 Javascript
深入浅析Extjs中store分组功能的使用方法
2016/04/20 Javascript
jquery中用jsonp实现搜索框功能
2016/10/18 Javascript
JS实现最简单的冒泡排序算法
2017/02/15 Javascript
微信小程序中hidden不生效原因的解决办法
2017/04/26 Javascript
简单实现js拖拽效果
2017/07/25 Javascript
微信小程序实现上传图片功能
2018/05/28 Javascript
vue左右侧联动滚动的实现代码
2018/06/06 Javascript
vue项目中实现缓存的最佳方案详解
2019/07/11 Javascript
手把手带你入门微信小程序新框架Kbone的使用
2020/02/25 Javascript
javascript设计模式 ? 访问者模式原理与用法实例分析
2020/04/26 Javascript
node.js如何操作MySQL数据库
2020/10/29 Javascript
小程序自定义圆形进度条
2020/11/17 Javascript
对Python实现简单的API接口实例讲解
2018/12/10 Python
django多个APP的urls设置方法(views重复问题解决)
2019/07/19 Python
Pandas实现dataframe和np.array的相互转换
2019/11/30 Python
利用Python如何制作贪吃蛇及AI版贪吃蛇详解
2020/08/24 Python
python如何设置静态变量
2020/09/07 Python
纯CSS3打造属于自己的“小黄人”
2016/03/14 HTML / CSS
美特斯邦威官方商城:邦购网
2016/10/13 全球购物
会计学财务管理专业个人的自我评价
2013/10/19 职场文书
汽车专业毕业生推荐信
2013/11/12 职场文书
汽车技术服务英文求职信范文
2014/01/02 职场文书
女儿十岁生日答谢词
2014/01/27 职场文书
《匆匆》教学反思
2014/02/22 职场文书
会计电算化专业自荐信
2014/03/15 职场文书
企业员工爱岗敬业演讲稿
2014/08/26 职场文书
运动会100米广播稿
2015/08/19 职场文书
如何给HttpServletRequest增加消息头
2021/06/30 Java/Android