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中实现两个字典(dict)合并的方法
Sep 23 Python
使用优化器来提升Python程序的执行效率的教程
Apr 02 Python
Python psutil模块简单使用实例
Apr 28 Python
在Python的web框架中中编写日志列表的教程
Apr 30 Python
Python实现求笛卡尔乘积的方法
Sep 16 Python
python爬虫之BeautifulSoup 使用select方法详解
Oct 23 Python
Python简单生成随机数的方法示例
Mar 31 Python
pycharm运行程序时在Python console窗口中运行的方法
Dec 03 Python
python3去掉string中的标点符号方法
Jan 22 Python
如何利用Anaconda配置简单的Python环境
Jun 24 Python
python进程间通信Queue工作过程详解
Nov 01 Python
selenium3.0+python之环境搭建的方法步骤
Feb 01 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初学者头疼问题总结
2006/10/09 PHP
yii2分页之实现跳转到具体某页的实例代码
2016/06/02 PHP
PHP构造函数与析构函数用法示例
2016/09/28 PHP
JavaScript面向对象编程
2008/03/02 Javascript
jquery左右滚动焦点图banner图片鼠标经过显示上下页按钮
2013/10/11 Javascript
鼠标滚轮改变图片大小的示例代码
2013/11/20 Javascript
js拖拽一些常见的思路方法整理
2014/03/19 Javascript
Javascript字符串拼接小技巧(推荐)
2016/06/02 Javascript
vue-router中的hash和history两种模式的区别
2018/07/17 Javascript
node中的密码安全(加密)
2018/09/17 Javascript
Vue组件Draggable实现拖拽功能
2018/12/01 Javascript
微信小程序实现分享朋友圈的图片功能示例
2019/01/18 Javascript
JavaScript显式数据类型转换详解
2019/03/18 Javascript
详解使用uni-app开发微信小程序之登录模块
2019/05/09 Javascript
vue项目前端知识点整理【收藏】
2019/05/13 Javascript
Ajax请求时无法重定向的问题解决代码详解
2019/06/21 Javascript
微信小程序 wx.getUserInfo引导用户授权问题实例分析
2020/03/09 Javascript
vue2.0 解决抽取公用js的问题
2020/07/31 Javascript
使用Vant完成通知栏Notify的提示操作
2020/11/11 Javascript
[58:15]2018DOTA2亚洲邀请赛 4.1 小组赛 A组 NB vs Liquid
2018/04/02 DOTA
使用Python实现BT种子和磁力链接的相互转换
2015/11/09 Python
Python实现点阵字体读取与转换的方法
2019/01/29 Python
elasticsearch python 查询的两种方法
2019/08/04 Python
python lambda函数及三个常用的高阶函数
2020/02/05 Python
Django 返回json数据的实现示例
2020/03/05 Python
html5实现移动端适配完美写法
2017/11/16 HTML / CSS
英国豪华文具和皮具配件经典老品牌:Smythson(斯迈森)
2018/04/19 全球购物
金鑫耀Java笔试题
2014/09/06 面试题
升学宴演讲稿
2014/09/01 职场文书
党的群众路线教育实践活动总结材料
2014/10/30 职场文书
慰问信格式规范
2015/03/23 职场文书
2015双创工作总结
2015/07/24 职场文书
歌咏比赛口号大全
2015/12/25 职场文书
导游词之河北滦平金山岭长城
2019/10/16 职场文书
关于Javascript闭包与应用的详解
2021/04/22 Javascript
MySQL大小写敏感的注意事项
2021/05/24 MySQL