往往网站都不会把一些图片或其他文件放在本地,会考虑用第三方服务来存储,这里我就使用的是七牛,类似的有(sae,又拍云等)
选择
七牛的官方网站提供了python的SDK,还有Django的插件使用,有兴趣的可以去github上看django-qiniu ,这里我使用的是另一种方式 Django-qiniu-storage
安装
pip install django-qiniu-storage
,
配置
你的项目中的setting.py配置 七牛:
QINIU_ACCESS_KEY = '**' # 你的七牛云个人中心里可以找到,下同
QINIU_SECRET_KEY = '**'
QINIU_BUCKET_NAME = '**' # 你的存储空间名字
QINIU_BUCKET_DOMAIN = '**.bkt.clouddn.com' # 外链默认域名
QINIU_SECURE_URL = False # 使用http
下面的是个人试了很久终于成功的配置,(其他博客总喜欢挖些坑。。。),先说上传的文件
PREFIX_URL = 'http://'
# 文件系统更改
MEDIA_URL = PREFIX_URL + QINIU_BUCKET_DOMAIN + "media/"
# MEDIA_ROOT = os.path.join(BASE_DIR, 'media').replace("\\", "/")
MEDIA_ROOT = 'media/'
DEFAULT_FILE_STORAGE = 'qiniustorage.backends.QiniuMediaStorage'
MEDIA_URL 是外部访问你文件的链接,
DEFAULT_FILE_STORAGE 更换了Django的默认文件存储系统,有关django的文件存储系统,可以参考Django 官方文档中的这几篇: Managing files, Managing static files, The staticfiles app 。
MEDIA_ROOT:这里是看的源码才改成这样的,原来一直按照以前的方式
# MEDIA_ROOT = os.path.join(BASE_DIR, 'media').replace("\\", "/") #存储系统的文件根路径
一直有坑,(别个博客都这样就成功了吗??)
所以参考源码改了,
class QiniuMediaStorage(QiniuStorage):
def __init__(self, *args, **kwargs):
warnings.warn(
"QiniuMediaStorage is deprecated, and will be removed in the future."
"User uploads handled by QiniuMediaStorage are public and can be accessed without any checks."
"For general use, please choose QiniuPrivateStorage instead."
, DeprecationWarning)
super(QiniuMediaStorage, self).__init__(*args, **kwargs)
location = settings.MEDIA_ROOT # 就是这里,上传可以指定路径
如果用默认的qiniustorage.backends.QiniuStorage
就不用指定,
至于models.py:
class Picture(models.Model):
uploader = models.ForeignKey(User, on_delete=models.CASCADE)
description = models.CharField(null=True, blank=True, max_length=40)
timestamp = models.DateTimeField(auto_now_add=True)
content = models.ImageField() # upload_to参数就不需要指明了,
静态文件,大同小异,不过我没用过,我只上传了图片
STATIC_URL = QINIU_BUCKET_DOMAIN + '/static/'
# STATIC_URL = '/static/'
STATICFILES_DIRS = [
os.path.join(BASE_DIR, 'static'),
]
STATIC_ROOT = 'static/'
STATICFILES_STORAGE = 'qiniustorage.backends.QiniuStaticStorage'
staticfiles
提供了一个名为 collectstatic
的命令
python manage.py collectstatic
它会收集各个 app 的根目录下的 static
子目录下的文件, 并汇总到一个地方。如果将 django settings 里的 STATICFILES_STORAGE
设置为 QiniuStorage
,collectstatic
收集到的静态文件就会被统一上传到七牛