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使用socket远程连接错误处理方法
Apr 29 Python
Python中函数及默认参数的定义与调用操作实例分析
Jul 25 Python
Anaconda多环境多版本python配置操作方法
Sep 12 Python
python 创建一个空dataframe 然后添加行数据的实例
Jun 07 Python
python 实现selenium断言和验证的方法
Feb 13 Python
python实现的爬取电影下载链接功能示例
Aug 26 Python
python进程的状态、创建及使用方法详解
Dec 06 Python
Python 实现网课实时监控自动签到、打卡功能
Mar 12 Python
jupyter notebook 多环境conda kernel配置方式
Apr 10 Python
python实现图片批量压缩
Apr 24 Python
使用Django实现商城验证码模块的方法
Jun 01 Python
Python+Tkinter制作专属图形化界面
Apr 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的FTP学习(三)
2006/10/09 PHP
PHP 文章中的远程图片采集到本地的代码
2009/07/30 PHP
PHP从数组中删除元素的四种方法实例
2017/05/12 PHP
Laravel如何使用数据库事务及捕获事务失败后的异常详解
2017/10/23 PHP
thinkPHP中钩子的使用方法实例分析
2017/11/16 PHP
Laravel框架自定义公共函数的引入操作示例
2019/04/16 PHP
Firefox window.close()的使用注意事项
2009/04/11 Javascript
客户端js性能优化小技巧整理
2013/11/05 Javascript
jQuery不兼容input的change事件问题解决过程
2014/12/05 Javascript
JQuery中extend的用法实例分析
2015/02/08 Javascript
javascript数据结构与算法之检索算法
2015/04/04 Javascript
jquery实现简单的自动播放幻灯片效果
2015/06/13 Javascript
jQuery表格的维护和删除操作
2017/02/03 Javascript
javascript 开发之百度地图使用到的js函数整理
2017/05/19 Javascript
js使用html2canvas实现屏幕截取的示例代码
2017/08/28 Javascript
微信小程序tabBar用法实例详解
2017/12/04 Javascript
Angular17之Angular自定义指令详解
2018/01/21 Javascript
详解基于Vue-cli搭建的项目如何和后台交互
2018/06/29 Javascript
express框架下使用session的方法
2019/07/31 Javascript
vue实现淘宝购物车功能
2020/04/20 Javascript
Django 如何获取前端发送的头文件详解(推荐)
2017/08/15 Python
Python打开文件,将list、numpy数组内容写入txt文件中的方法
2018/10/26 Python
Python Numpy:找到list中的np.nan值方法
2018/10/30 Python
Python高斯消除矩阵
2019/01/02 Python
我用Python抓取了7000 多本电子书案例详解
2019/03/25 Python
Python3.5 Pandas模块之Series用法实例分析
2019/04/23 Python
PyCharm License Activation激活码失效问题的解决方法(图文详解)
2020/03/12 Python
基于python实现MQTT发布订阅过程原理解析
2020/07/27 Python
Django自带用户认证系统使用方法解析
2020/11/12 Python
html5 Canvas画图教程(5)—canvas里画曲线之arc方法
2013/01/09 HTML / CSS
小学见习报告
2014/10/31 职场文书
信用卡工资证明范本
2015/06/19 职场文书
暑假生活随笔
2015/08/15 职场文书
2016年清明节网上祭英烈活动总结
2016/04/01 职场文书
Python数据结构之队列详解
2022/03/21 Python
浅谈Vue的computed计算属性
2022/03/21 Vue.js