Django自定義七牛儲存Storage
往往網站都不會把一些圖片或其他檔案放在本地,會考慮用第三方服務來儲存,這裡我就使用的是七牛,類似的有(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
收集到的靜態檔案就會被統一上傳到七牛