Saya mengonfigurasi proyek Django yang menggunakan sistem berkas server untuk menyimpan berkas statis aplikasi ( STATIC_ROOT
) dan berkas unggahan pengguna ( MEDIA_ROOT
).
Sekarang saya perlu menghosting semua konten itu di Amazon S3, jadi saya telah membuat keranjang untuk ini. Menggunakan django-storages
dengan boto
backend penyimpanan, saya berhasil mengunggah statika yang dikumpulkan ke bucket S3:
MEDIA_ROOT = '/media/'
STATIC_ROOT = '/static/'
DEFAULT_FILE_STORAGE = 'storages.backends.s3boto.S3BotoStorage'
AWS_ACCESS_KEY_ID = 'KEY_ID...'
AWS_SECRET_ACCESS_KEY = 'ACCESS_KEY...'
AWS_STORAGE_BUCKET_NAME = 'bucket-name'
STATICFILES_STORAGE = 'storages.backends.s3boto.S3BotoStorage'
Kemudian, saya mendapat masalah: MEDIA_ROOT
dan STATIC_ROOT
tidak digunakan dalam bucket, jadi root bucket berisi file statis dan jalur yang diupload pengguna.
Jadi saya bisa mengatur:
S3_URL = 'http://s3.amazonaws.com/%s' % AWS_STORAGE_BUCKET_NAME
STATIC_URL = S3_URL + STATIC_ROOT
MEDIA_URL = 'S3_URL + MEDIA_ROOT
Dan gunakan pengaturan tersebut di template, tetapi tidak ada perbedaan antara file statis / media saat menyimpan di S3 dengan django-storages
.
Bagaimana ini bisa dilakukan?
Terima kasih!
sumber
AWS_STORAGE_BUCKET_NAME
), dan itulah yang digunakan saat instance kelas yang ditentukan diSTATICFILES_STORAGE
dibuatkan.Jawaban:
Saya pikir yang berikut harus berfungsi, dan lebih sederhana daripada metode Mandx, meskipun sangat mirip:
Buat
s3utils.py
file:Kemudian di
settings.py
:Contoh yang berbeda namun terkait (yang sebenarnya telah saya uji) dapat dilihat di dua
example_
file di sini .sumber
Saat ini saya menggunakan kode ini dalam
s3utils
modul terpisah :Kemudian, di modul pengaturan saya:
Saya harus mendefinisikan ulang
_normalize_name()
metode privat untuk menggunakan versi "tetap" darisafe_join()
fungsi tersebut, karena kode asli memberi sayaSuspiciousOperation
pengecualian untuk jalur hukum.Saya memposting ini untuk pertimbangan, jika ada yang bisa memberikan jawaban yang lebih baik atau meningkatkan yang ini, itu akan sangat disambut.
sumber
Dan lari:
python manage.py collectstatic
sumber
storages.py
alih-alihcustom_storages.py
Anda ingin menggunakanfrom __future__ import absolute_import
Saya pikir jawabannya cukup sederhana dan dilakukan secara default. Ini berfungsi untuk saya di AWS Elastic Beanstalk dengan Django 1.6.5 dan Boto 2.28.0:
Kunci AWS diteruskan dari file konfigurasi penampung dan saya tidak memilikinya
STATIC_ROOT
atauSTATIC_URL
disetel sama sekali. Juga, tidak perlus3utils.py
file tersebut. Detail ini ditangani oleh sistem penyimpanan secara otomatis. Triknya di sini adalah saya perlu mereferensikan jalur yang tidak diketahui ini di templat saya dengan benar dan dinamis. Sebagai contoh:Begitulah cara saya menangani favicon saya yang ada secara lokal (pra-penerapan) di
~/Projects/my_app/project/my_app/static/img/favicon.ico
.Tentu saja saya memiliki
local_settings.py
file terpisah untuk mengakses barang ini secara lokal di lingkungan dev dan itu memang memiliki pengaturan STATIC dan MEDIA. Saya harus melakukan banyak percobaan dan membaca untuk menemukan solusi ini dan bekerja secara konsisten tanpa kesalahan.Saya memahami bahwa Anda memerlukan pemisahan statis dan root dan mengingat bahwa Anda hanya dapat menyediakan satu bucket, saya akan menunjukkan bahwa metode ini mengambil semua folder di lingkungan lokal saya di bawah
~/Projects/my_app/project/my_app/static/
dan membuat folder di root bucket (yaitu: S3bucket / img / seperti pada contoh di atas). Jadi Anda mendapatkan pemisahan file. Misalnya Anda bisa memilikimedia
folder distatic
folder dan mengaksesnya melalui templat dengan ini:Saya harap ini membantu. Saya datang ke sini mencari jawabannya dan mendorong sedikit lebih keras untuk menemukan solusi yang lebih sederhana daripada memperluas sistem penyimpanan. Sebaliknya, saya membaca dokumentasi tentang tujuan penggunaan Boto dan saya menemukan bahwa banyak hal yang saya butuhkan sudah ada di dalamnya secara default. Bersulang!
sumber
Jika Anda ingin memiliki subfolder bahkan sebelum media atau pemisahan statis, Anda dapat menggunakan AWS_LOCATION di atas jawaban bradenm. Referensi: https://django-storages.readthedocs.io/en/latest/backends/amazon-S3.html#usage
sumber