Pertanyaan Bagaimana cara mengatur STATIC_ROOT dan MEDIA_ROOT sehingga path yang digunakan tidak dikode keras?


Dalam file settings.py saya keduanya STATIC_ROOT dan MEDIA_ROOT keduanya saat ini mengarah ke lokasi berkode keras. Misalnya, STATIC_ROOT jalurnya adalah:

/home/ian/projectname/mysite/appname/static

Saya tahu ini akan menyebabkan masalah ketika saya menyebarkan proyek saya.

Melihat sekeliling saya dapat melihat bahwa saya perlu memanfaatkannya os.path tetapi banyak sekali contoh yang membuat saya bingung.

Saya telah mencoba untuk melihat permutasi yang berbeda dari pengaturan file ini (atau mendapatkan nilai contoh seperti yang digunakan untuk mengatur BASE_DIR) namun sebagai screen shot menunjukkan saya kehilangan sesuatu karena itu mengeluh tentang mengajukan nilai.

Dalam hal kebutuhan saya menggunakan Django 1.6

Terima kasih sebelumnya.

enter image description here


5
2017-07-20 20:50


asal


Jawaban:


Pertama, Anda menerima kesalahan ini sebagai akibat dari menambahkan __file__ dalam shell interaktif:

NameError: name '__file__' is not defined

Shell tidak mendeteksi jalur file saat ini __file__ yang berhubungan dengan Anda filepath di mana Anda menambahkan baris ini. Untuk bekerja, misalnya, Anda harus memasukkan ini file.py:

os.path.join(os.path.dirname(__file__))

Kemudian, jalankan ini dari baris perintah:

python file.py

Hal ini karena __file__ berhubungan dengan apa pun filepath dari file.py aku s.

Dalam kasus settings.py, gunakan ini untuk mendapatkan direktori root dari proyek Django Anda:

BASE_DIR = os.path.dirname(os.path.dirname(__file__))

Anda dapat menggunakannya os.path.join() untuk bergabung dengan jalur relatif lainnya, seperti:

STATIC_ROOT = os.path.join(BASE_DIR, 'static')
TEMPLATE_DIRS = os.path.join(BASE_DIR, 'templates')

Untuk informasi lebih lanjut tentang cara menyusun direktori proyek Django Anda, baca ini: Struktur umum


5
2017-07-20 21:33



Praktik yang biasa (disarankan di tutorial resmi Django juga) adalah memiliki BASE_DIR pengaturan yang mendapat direktori kerja saat ini dari __file__:

BASE_DIR = os.path.dirname(os.path.abspath(__file__))

Kemudian, gunakan os.path.join() jalur relatif lainnya dibangun, misalnya:

STATIC_ROOT = os.path.join(BASE_DIR, 'static')

Perhatikan itu __file__ hanya tersedia untuk modul, tidak masuk akal untuk menggunakannya di konsol.


3
2017-07-20 20:55