前言
环境:Django==1.8.4
django-qiniu-storage==2.1.1
注册七牛云账号
注册好账号后,1、 在个人中心 > 密钥管理
里面找到自己的AccessKey/SecretKey
。
2、在对象存储 > 空间管理
里面新建空间
, 得到空间名、空间域名
。这样子就拿到需要的四个配置的参数。
1 | AccessKey |
配置Django项目
安装七牛云的包
1
pip install django-qiniu-storage
配置
setting.py
1
2
3
4
5
6
7
8
9
10QINIU_ACCESS_KEY = 'Your AccessKey'
QINIU_SECRET_KEY = 'Your SecretKey'
QINIU_BUCKET_NAME = 'Your Bucket Name'
QINIU_BUCKET_DOMAIN = 'Your Bucket Domain'
MEDIA_URL = QINIU_BUCKET_DOMAIN + '/media/'
STATIC_URL = QINIU_BUCKET_DOMAIN + '/static/'
DEFAULT_FILE_STORAGE = 'qiniustorage.backends.QiniuMediaStorage'
STATICFILES_STORAGE = 'qiniustorage.backends.QiniuStaticStorage'运行命令上传文件到七牛云
1
python manage.py collectstatic
如此,STATIC和MEDIA文件都会上传到七牛云上。
上面设置需要修改MEDIA_URL和STATIC_URL来使得页面上的文件URL是七牛云的域名,实际上也可以自定义STORAGE类来自定义URL,如此可以通过一个变量USE_CDN来控制是否需要上传静态文件。
1
2
3
4
5
6
7
8
9
10
11
12
13# settings.py
QINIU_ACCESS_KEY = 'Your AccessKey'
QINIU_SECRET_KEY = 'Your SecretKey'
QINIU_BUCKET_NAME = 'Your Bucket Name'
QINIU_BUCKET_DOMAIN = 'Your Bucket Domain'
MEDIA_URL = '/media/'
STATIC_URL = '/static/'
DEFAULT_FILE_STORAGE = 'app.helper.my_qiniu.MyQiniuMediaStorage'
STATICFILES_STORAGE = 'app.helper.my_qiniu.MyQiniuStaticStorage'
USE_CDN = True1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18# app/helper/my_qiniu.py
import re
from django.conf import settings
class MyQiniuMediaStorage(QiniuMediaStorage):
def url(self, name):
if not re.match('media/(.*)', name):
name = self._normalize_name(self._clean_name(name))
else:
name = self._clean_name(name)
return urljoin(settings.PROTOCOL + self.bucket_domain, name) if settings.USE_CDN else name
class MyQiniuStaticStorage(QiniuStaticStorage):
def url(self, name):
name = self._normalize_name(self._clean_name(name))
return urljoin(settings.PROTOCOL + self.bucket_domain, name) if settings.USE_CDN else name
问题处理
使用python mangae.py collectstatic 400报错,报错信息如下:
1
qiniustorage.utils.QiniuError: exception:None, status_code:400, _ResponseInfo__response:<Response [400]>, text_body:{"error":"incorrect region, please use up-na0.qiniup.com"}, req_id:vusAAACUXt1b8mUW, error:incorrect region, please use up-na0.qiniup.com, x_log:X-Log
解决:
django-qiniu-storage
插件默认的区域是华东区域
的接口,在settings.py
里面配置成存储空间所在区域的接口即可,下面以北美地区
为例。1
2from qiniu.config import set_default
set_default(default_up_host='up-na0.qiniup.com')设置默认存储是七牛云后,会导致查询文件速度慢
1
2
3
4
5
6
7
8
9content_type = ContentType.objects.get_for_model(bundle.obj)
for f in MyUploads.objects.filter(object_id=bundle.obj.pk, content_type=content_type):
b = UploadsResource().build_bundle(obj=f.upload, request=bundle.request)
upload_bundle = UploadsResource().full_dehydrate(b, for_list=True)
upload_bundle.data['category'] = f.category
upload_bundle.data['name'] = f.name or f.upload.file_name
upload_bundle.data['keywords'] = f.keywords
bundle.data['files'].append(upload_bundle)解决方法:
一开始以为是ContentType关联速度慢导致,但是后来发现,taspie执行full_dehydrate时,读取文件的大小和宽高,而数据库中,Upload的file其实只是存储了文件的位置,执行这些操作是需要先从七牛云下载文件的,这也就是造成速度慢的原因,也就是说,实际上只有self.file.url是从数据库读取的。因此不建议查询的时候去获取文件的其他信息。或者建立一些其他字段,在上传的时候就保存好这些信息。
扩展
django中脚本:
依赖:qiniu
和qiniustorage
更多qiniu的脚本用法见:https://developer.qiniu.com/insight/4662/sdk
1 | # -*- coding: utf-8 -*- |
本文链接: http://www.ionluo.cn/blog/posts/5e2a48c7.html
版权声明: 本作品采用 知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议 进行许可。转载请注明出处!