تنظیمات پروژه

سلام

فارغ از اینکه ریپازیتوری شما به صورتی عمومی یا خصوصی باشد هرگز نباید اطلاعات حساس خود را روی مخزن راه دور ارسال کنید. این اطلاعات شامل کلیدهای خصوصی، کلیدهای رمزنگاری، پسوردها، کلیدهای API و … می شود.

در این مرحله می خواهیم دو مدل پیکربندی را در ماژول settings.py انجام دهیم.

  • اطلاعات حساس نظیر کلیدها و پسوردها
  • تنظیمات خاص برنامه که محرمانگی دارد
# environment variables
import os
SECRET_KEY = os.environ['SECRET_KEY']

# or local files
with open('/etc/secret_key.txt') as f:
    SECRET_KEY = f.read().strip()

برای اینکار یک کتابخانه فوق العاده به نام Python Decouple وجود دارد که من در تمام برنامه هایم از آن استفاده می کنم. این برنامه فایل های محلی را برای یافتن فایل env. جست و جو کرده و سپس متغیرهای مربوط به تنظیمات را از متغیرهای محیطی (Environment variables=env)  در فایل env. بر می دارد. به این ترتیب تمام داده های حساس در env. ذخیره شده و فایل تنظیمات (settings.py) قابل انتقال است. همچنین واسطی را برای تعریف متغیرهای اولیه تهیه کرده و در صورت سازگاری و امکان و با حفظ امانت داری نوع داده را در انواع int, bool, list و … انتقال می دهد.

استفاده از این ابزار اجباری نیست اما برای من که خیلی کار راه انداز و مفید است و با سرویس هایی نظیر Heroku نیز به خوبی سازگاری دارد. ابتدا آن را نصب می کنیم.

pip install python-decouple

myproject/settings.py

from decouple import config

SECRET_KEY = config('SECRET_KEY')

سپس اطلاعات حساس را داخل فایلی به نام env. قرار می دهیم. (به علامت نقطه قبل از آن توجه کنید.) محل قرارگیری این فایل در همان جایی است که فایل manage.py قرار دارد.

Libogram/
 |-- Libogram/
 |    |-- accounts/
 |    |-- boards/
 |    |-- myproject/
 |    |-- static/
 |    |-- templates/
 |    |-- .env        <-- here!
 |    |-- .gitignore
 |    |-- db.sqlite3
 |    +-- manage.py
 +-- venv/

محتوای Env. مشابه زیر خواهد بود.

SECRET_KEY=rqr_cjv4igscyu8&&(0ce(=sy=f2)p=f_wn&@0xsp7m$@!kp=d

نکته این است که فایل env. درون فایل gitignore. نادیده گرفته می شود. بنابراین هر زمانی که برنامه را توسعه دادیم یا خواستیم روی ماشین دیگری آن را بارگزاری و اجرا کنیم لازم است قبل از آن فایل env. را به صورت دستی ساخته و تنظیمات لازم را انجام دهیم.

حالا می خواهیم کتابخانۀ دیگری را نصب کنیم تا به واسطۀ آن و تنها در یک خط بتوانیم کانکشن و اتصال به دیتابیس را برقرار کنیم. این راه از سایر روش ها برای اتصال به دیتابیس راحت تر است.

pip install dj-database-url

و مانند قبل مقادر دیتابیس را با استفاده از کتابخانه Decouple مقداردهی می کنیم. یعنی در فایل settings.py با استفاده از تابع config از کتابخانه decouple می گوییم که مقدار مورد نظر در چه متغیری از فایل env. ذخیره شده است. (اگر چند بار این پاراگراف را بخوانی حتما متوجه خواهی شد.)

myproject/settings.py

from decouple import config, Csv
import dj_database_url

SECRET_KEY = config('SECRET_KEY')
DEBUG = config('DEBUG', default=False, cast=bool)
ALLOWED_HOSTS = config('ALLOWED_HOSTS', cast=Csv())
DATABASES = {
    'default': dj_database_url.config(
        default=config('DATABASE_URL')
    )
}

در مثال بالا نحوۀ دیگری از بکارگیری تابع config در زمان مقداردهی متغیر DEBUG قابل مشاهده است که هم نام متغیر در فایل env. به آن معرفی و هم مقدار پیش فرض تعیین و هم نوع داده ای از جنس Bool تنظیم شده است. مقدار پیش فرض در صورتی اعمال می شود که در فایل env. به آن پرداخته نشده باشد.

و حالا نمونۀ فایل env. مشابه زیر خواهد شد:

SECRET_KEY=rqr_cjv4igscyu8&&(0ce(=sy=f2)p=f_wn&@0xsp7m$@!kp=d
DEBUG=True
ALLOWED_HOSTS=.localhost,127.0.0.1

ضمنا استفاده از تابع ()csv در نوع داده (به معنای cast) به این معناست که متغیر مذکور (ALLOWED_HOSTS ) از نوع لیست و مقدار آن برابر است با:

['.localhost', '127.0.0.1'. ]

حالا به این نکته می رسیم که چرا استفاده از decouple خوب است؟ چون مقدار [.'localhost','127.0.0.1.'] برای زمانی است که برنامه روی لوکال هاست در حال اجراست و حالا که می خواهیم برنامه را روی سرور قرار دهیم؛ کافی است مقدار ALLOWED_HOSTS در فایل env. را به [,'.djangoboards.com' ] یا هر دامنۀ دیگری تغییر دهیم. به این شیوه هم امنیت حفظ و هم تغییرات و مهاجرت ها آسان و تجمیع می شود.

نکتۀ مهم دیگر اینکه با چنین تغییری برنامه صرفاً به درخواست هایی که از این دامنه فرستاده شود؛ جواب می دهد.

ترجمۀ اختصاصی توسط تمدن

 

مطلب بعدی:

مطلب قبلی:

 

0 پاسخ

دیدگاه خود را ثبت کنید

تمایل دارید در گفتگو شرکت کنید؟
نظری بدهید!

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *