Pertanyaan Mendistribusikan proyek Django dengan SECRET_KEY yang unik


Saya memiliki proyek Django yang ingin saya distribusikan di repositori publik seperti bitbucket atau github. Saya ingin menginstalnya semudah mungkin, jadi saya termasuk proyek penuh, bukan hanya aplikasi yang dapat di-pluggable. Ini berarti bahwa settings.py file akan disertakan juga.

Bagaimana saya bisa menghindari masalah settings.SECRET_KEY sama untuk setiap instalasi?

Apakah hanya itu sederhana solusi agar pengguna memodifikasi secara manual settings.py?

Haruskah saya menyimpan kunci di database default dan miliki settings.py menginisialisasi jika tidak ada? Itu akan memecahkan masalah, tapi saya bertanya-tanya apakah sudah ada cara standar untuk melakukan ini.

Terima kasih!


44
2018-01-12 02:05


asal


Jawaban:


Saya akan melakukannya dengan cara ini:

Miliki kunci rahasia di file terpisah "secret_key.py". File ini tidak ada untuk instalasi murni. Di settings.py Anda menyertakan sesuatu seperti:

try:
    from .secret_key import SECRET_KEY
except ImportError:
    SETTINGS_DIR = os.path.abspath(os.path.dirname(__file__))
    generate_secret_key(os.path.join(SETTINGS_DIR, 'secret_key.py'))
    from .secret_key import SECRET_KEY

Fungsi itu generate_secret_key(filename) yang akan Anda tulis menghasilkan file bernama filename (yang, seperti yang kita sebut, akan menjadi secret_key.py dalam dir yang sama dengan settings.py) dengan isinya:

SECRET_KEY = '....random string....'

Di mana string acak adalah kunci yang dihasilkan berdasarkan nomor acak.

Untuk generasi kunci Anda dapat menggunakan saran Umang https://stackoverflow.com/a/16630719/166761.


35
2018-01-12 21:13



Untuk menambah apa Carles Barrobés kata, Anda dapat menghasilkan kunci baru menggunakan metode yang digunakan Django startproject:

from django.utils.crypto import get_random_string

chars = 'abcdefghijklmnopqrstuvwxyz0123456789!@#$%^&*(-_=+)'
get_random_string(50, chars)

63
2018-05-19 01:49



Secara umum, Anda dapat membagi konfigurasi Django ke dalam hal-hal yang khusus aplikasi dan hal-hal yang khusus untuk server. Ini termasuk kategori yang terakhir.

Ada sejumlah cara untuk mengatasi masalah konfigurasi khusus server, hal ini dibahas lebih lanjut pertanyaan ini.

Untuk contoh khusus ini, dengan menggunakan pendekatan yang saya uraikan dalam jawaban saya untuk pertanyaan lain, saya akan menempatkan penggantinya settings_local.py.sample untuk distribusi, dan selama instalasi, saya akan menyalinnya ke settings_local.py dan edit sesuai.


5
2018-01-12 02:16



Saya akan menyelesaikan masalah seperti ini:

  • Berikan kunci rahasia tiruan seperti: I_AM_A_DUMMY_KEY_CHANGE_ME
  • Buat perintah kelola untuk menghasilkan yang baru: ./manage.py gen_secret_key
  • Dalam dokumentasi, SANGAT menyarankan pengguna untuk menjalankan perintah sesegera mungkin

2
2018-05-19 00:59



Dalam kode saya, saya memiliki tiga tingkat file pengaturan yang terinspirasi oleh Dua Scoop dari Django, jadi yang tengah berjalan seperti ini di mana BASE_PRIVATE_DIR diatur dalam template dasar. Dalam kasus saya ini adalah dari direktori Django ../../mysite_private tetapi di suatu tempat ouside file normal di bawah aplikasi git .:

from .base import *

ALLOWED_HOSTS = ['staging.django.site'] 
#Allow local override which is per deployment instance.  There should probably then be
#  an instance git for version control of the production data
try:
    import sys
    private_path = BASE_PRIVATE_DIR.child('production')
    sys.path.append(private_path)
    from private_settings import *
except ImportError:
    print(" No production overide private_settings.py found.  This is probably an error  = {}".format(private_path))
    # If it doesnt' exist that is fine and just use system and environment defaults

1
2018-06-11 20:20



Jika Anda membuat proyek baru menggunakan template, suka django-admin.py startproject --template=path_to_template project_name hanya menempatkan {{ secret_key }} ke dalam file pengaturan template proyek Anda (misalnya settings.py) SECRET_KEY = '{{ secret_key }}' dan Django akan membuatnya untuk Anda.


0
2018-06-21 09:32



Dalam solusi ini saya gunakan Django-dotenv, yang merupakan salah satu dependensi proyek saya, seperti yang tercantum dalam requirements.txt seperti django-dotenv==1.4.1. Keuntungan dari pendekatan ini adalah Anda memiliki perbedaan .env file untuk setiap lingkungan tempat aplikasi diinstal.

Buat file utils.py di direktori yang sama settings.py dengan konten berikut:

from django.utils.crypto import get_random_string

def generate_secret_key(env_file_name):
    env_file = open(env_file_name, "w+")
    chars = 'abcdefghijklmnopqrstuvwxyz0123456789!@#$%^&*(-_=+)'
    generated_secret_key = get_random_string(50, chars)
    env_file.write("SECRET_KEY = '{}'\n".format(generated_secret_key))
    env_file.close()

Kemudian modifikasi settings.py file sebagai berikut:

import dotenv
from [project-folder-name] import utils
...
try:
    SECRET_KEY = os.environ['SECRET_KEY']
except KeyError:
    path_env = os.path.join(BASE_DIR, '.env')
    utils.generate_secret_key(path_env)
    dotenv.read_dotenv(path_env)
    SECRET_KEY = os.environ['SECRET_KEY']

Bagi yang tidak menggunakannya django-dotenv, Anda harus melakukannya untuk menambahkannya sebagai ketergantungan dan mengubah manage.py untuk memuatnya saat startup:

import dotenv

if __name__ == "__main__":
    dotenv.read_dotenv()

0
2018-03-19 12:01