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

سلام

فارغ از اینکه ریپازیتوری شما به صورتی عمومی یا خصوصی باشد هرگز نباید اطلاعات حساس خود را روی مخزن راه دور ارسال کنید. این اطلاعات شامل کلیدهای خصوصی، کلیدهای رمزنگاری، پسوردها، کلیدهای 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' ] یا هر دامنۀ دیگری تغییر دهیم. به این شیوه هم امنیت حفظ و هم تغییرات و مهاجرت ها آسان و تجمیع می شود.

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

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

 

مطلب بعدی:

مطلب قبلی:

 

بدون دیدگاه

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

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

جنگو
پیکربندی گواهینامۀ https

سلام حالا می خواهیم برنامۀ خودمان را با گواهینامۀ https امن کنیم. ساده ترین کار برای انجام آن Let’s Encrypt است. قبل از Let’s Encrypt هرگز تنظیمات https به این راحتی نبوده و مهمتر اینکه اینکار کاملاً رایگان است. آن ها راه حلی به نام certbot را ارائه داده اند …

جنگو
پیکربندی سرویس ایمیل

سلام یکی از بهتر سرویس دهنده های ایمیل Mailgun با قابلیت ۱۲ هزار ایمیل رایگان در ماه است. به صورت رایگان ثبت نام کنید. برای اینکار باید آن را با سرویس دهندۀ دامین خود تنظیم کنید که در این آموزش از tamadon.org استفاده شده است. حالا اولین رکورد DNS را …

جنگو
پیکربندی NGINX

سلام کار بعدی که قرار است انجام شود؛ تنظیمان Nginx به شکلی است که پاسخگویی و سرویس دهی مربوط به فایل های استاتیک را خود انجام دهد و سایر درخواست ها را به Gunicorn بفرستد. یک فایل پیکربندی با نام boards را درون /etc/nginx/sites-available/ و با محتوای زیر اضافه می …

هرگونه استفادۀ از این آموزش به صورت رایگان و با ارجاع به تمدن جایز است.