জাজানোতে স্থানীয় বনাম উত্পাদন সেটিংস কীভাবে পরিচালনা করবেন?


297

স্থানীয় বিকাশ এবং উত্পাদন সার্ভারের জন্য সেটিংস পরিচালনা করার প্রস্তাবিত উপায় কী? তাদের মধ্যে কিছু (যেমন ধ্রুবক ইত্যাদি) উভয়টিতে পরিবর্তন / অ্যাক্সেস করা যেতে পারে তবে তাদের কয়েকটি (স্থির ফাইলের পাথের মতো) আলাদা থাকা প্রয়োজন, এবং তাই নতুন কোড স্থাপনের সময় প্রতিলিপি হওয়া উচিত নয়।

বর্তমানে, আমি সমস্ত ধ্রুবক যুক্ত করছি settings.py। তবে প্রতিবার যখন আমি স্থানীয়ভাবে কিছু ধ্রুবক পরিবর্তন করি তখন আমাকে এটিকে প্রযোজনা সার্ভারে অনুলিপি করতে হবে এবং উত্পাদন নির্দিষ্ট পরিবর্তনের জন্য ফাইলটি সম্পাদনা করতে হবে ... :(

সম্পাদনা: দেখে মনে হচ্ছে এই প্রশ্নের কোনও মানক উত্তর নেই, আমি সর্বাধিক জনপ্রিয় পদ্ধতিটি গ্রহণ করেছি।



দয়া করে একটি চেহারা আছে জ্যাঙ্গো-কনফিগারেশনের
জেজেডি 20'15

2
গৃহীত পদ্ধতিটি এখন আর সর্বাধিক জনপ্রিয় নয়।
ড্যানিয়েল

2
জাঙ্গো-স্প্লিট-সেটিংস ব্যবহার করা খুব সহজ। এটি কোনও ডিফল্ট সেটিংস পুনরায় লেখার প্রয়োজন হয় না।
sobulevn

ইও আপনার বেস.পি ফাইল এবং আপনার লোকাল.পিতে ".বেস আমদানি * থেকে" ব্যবহার করতে হবে, আপনার প্রোডাকশন -পি-তে ".বেস আমদানি * থেকে", আপনার প্রজেক্টটি চালাতে হবে: পাইথন ম্যানেজ.পি রানসরভার - সেটিংস = প্রকল্প_নাম.সেটিংস.লোকাল
রবার্থ সোলস

উত্তর:


127

ইন settings.py:

try:
    from local_settings import *
except ImportError as e:
    pass

আপনি যা প্রয়োজন তা ওভাররাইড করতে পারেন local_settings.py; এটি তখন আপনার সংস্করণ নিয়ন্ত্রণের বাইরে থাকা উচিত। তবে যেহেতু আপনি অনুলিপি উল্লেখ করেছেন আমি অনুমান করছি আপনি কোনওটিই ব্যবহার করবেন না;)


3
নতুন সেটিংস ট্র্যাকিং / স্থাপনার সুবিধার্থে উত্পাদন / পরীক্ষার মেশিনে "স্থানীয়_সেটিং.পি" ব্যবহার করুন এবং বিকাশের কোনও কিছুই নেই।
জন মি

8
আমি এইভাবেই করছি
সেটিংস.পি

61
এই পদ্ধতির অর্থ আপনার বিকাশ ও উত্পাদনে রূপান্তরিত কোড চলছে। এবং প্রতিটি বিকাশকারীদের একটি আলাদা কোড বেস থাকে I আমি এখানে অ্যান্টি-প্যাটার্ন কল করি।
পাইদানি

8
@ পেডান্নি সমস্যাটি হ'ল জাজানো এটির কনফিগারেশনটি .py ফাইলে সংরক্ষণ করে। আপনি আশা করতে পারবেন না যে সমস্ত বিকাশকারী এবং উত্পাদন সার্ভার একই সেটিংস ব্যবহার করবে, সুতরাং আপনাকে এই .py ফাইলটি পরিবর্তন করতে হবে বা কিছু বিকল্প সমাধান (.ini ফাইল, পরিবেশ ইত্যাদি) প্রয়োগ করতে হবে।
Tupteq

3
আমি মডিউলটিকে বর্ণানুক্রমিক ফোল্ডারের তালিকাগুলির সাথে গোষ্ঠী করার settings_localবিপরীতে কল করতে পছন্দ করি । গিটারের শংসাপত্রাদি নয় বলে ব্যবহার করে সংস্করণ নিয়ন্ত্রণ থেকে দূরে থাক। দুর্ঘটনাক্রমে ওপেন সোর্সিং কল্পনা করুন। আমি পরিবর্তে কল করা একটি টেম্পলেট ফাইল গিট রাখি । local_settingssettings.pysettings_local.py.gitignoresettings_local.py.txt
লাইন বিরতি

297

জ্যাঙ্গোর দুটি স্কুপ: জ্যাঙ্গো 1.5 এর জন্য সেরা অভ্যাসগুলি আপনার সেটিংস ফাইলগুলির জন্য সংস্করণ নিয়ন্ত্রণ ব্যবহার এবং ফাইলগুলিকে একটি পৃথক ডিরেক্টরিতে সঞ্চয় করার পরামর্শ দেয়:

project/
    app1/
    app2/
    project/
        __init__.py
        settings/
            __init__.py
            base.py
            local.py
            production.py
    manage.py

base.pyফাইল, যখন (যেমন MEDIA_ROOT বা প্রশাসক হিসাবে) সাধারণ সেটিংস রয়েছে local.pyএবং production.pyসাইট নির্দিষ্ট সেটিংস আছে:

বেস ফাইলটিতে settings/base.py:

INSTALLED_APPS = (
    # common apps...
)

স্থানীয় বিকাশ সেটিংস ফাইলটিতে settings/local.py:

from project.settings.base import *

DEBUG = True
INSTALLED_APPS += (
    'debug_toolbar', # and other apps for local development
)

ফাইল প্রোডাকশন সেটিংস ফাইলটিতে settings/production.py:

from project.settings.base import *

DEBUG = False
INSTALLED_APPS += (
    # other apps for production site
)

তারপরে আপনি যখন জাঙ্গো চালান, আপনি --settingsবিকল্পটি যুক্ত করুন:

# Running django for local development
$ ./manage.py runserver 0:8000 --settings=project.settings.local

# Running django shell on the production site
$ ./manage.py shell --settings=project.settings.production

বইটির লেখকগণ গিথুবের উপর একটি নমুনা প্রকল্পের বিন্যাস টেম্পলেটও রেখেছেন।


62
মনে রাখবেন যে --settingsপ্রতিবার ব্যবহারের পরিবর্তে আপনি DJANGO_SETTINGS_MODULEএনভেভার সেট করতে পারেন। এটি হিরোকু: সহ এটি দুর্দান্তভাবে কাজ করে: এটি বিশ্বব্যাপী উত্পাদনে সেট করে, তারপরে এটি আপনার .env ফাইলে ডেভ দিয়ে ওভাররাইড করে।
সাইমন ওয়েবার

9
DJANGO_SETTINGS_MODULEএনভিভ ভার ব্যবহার করা এখানে সেরা ধারণা, ধন্যবাদ সাইমন।
কিবিবু

20
আপনার BASE_DIRসেটিংস পরিবর্তন করতে হতে পারেos.path.dirname(os.path.realpath(os.path.dirname(__file__) + "/.."))
পেটর পেলার

5
@ আরএসপি জ্যাঙ্গো ডক্স অনুসারে, আপনি আমদানি করুন from django.conf import settingsযা এমন একটি বস্তু যা ইন্টারফেসটি বিমূর্ত করে এবং সেটিংসের অবস্থান থেকে কোডটি ডিকোপল করে

3
যদি আমি পরিবেশগত ভেরিয়েবলের মাধ্যমে DJANGO_SETTINGS_MODULE সেট করি তবে আমার কী আমার wsgi.py ফাইলে os.en वातावरण.setdefault ("DJANGO_SETTINGS_MODULE", "প্রকল্পের নাম। সেটিং.প্রডাকশন") দরকার? এছাড়াও, আমি পরিবেশগত বিভিন্নটি সেট করে রেখেছি: DJANGO_SETTINGS_MODULE = প্রোজেক্টনাম.সেটিংস.লোকাল রফতানি করুন, তবে আমি টার্মিনালটি বন্ধ করলে এটি হারিয়ে যায়। এটি সংরক্ষণ করা নিশ্চিত করতে আমি কী করতে পারি? আমি কি সেই লাইনটি বাশার্ক ফাইলটিতে যুক্ত করব?
ক্রিটজ

71

পরিবর্তে settings.py, এই বিন্যাসটি ব্যবহার করুন:

.
└── settings/
    ├── __init__.py  <= not versioned
    ├── common.py
    ├── dev.py
    └── prod.py

common.py যেখানে আপনার বেশিরভাগ কনফিগারেশন থাকে।

prod.py সাধারণ থেকে সবকিছু আমদানি করে এবং ওভাররাইড করার জন্য যা কিছু প্রয়োজন তা ওভাররাইড করে:

from __future__ import absolute_import # optional, but I like it
from .common import *

# Production overrides
DEBUG = False
#...

একইভাবে, ওভাররাইডের জন্য যা কিছু প্রয়োজন dev.pyতার থেকে সবকিছু আমদানি করে common.pyএবং ওভাররাইড করে।

অবশেষে, __init__.pyআপনি কোথায় সেটিংস লোড করবেন সিদ্ধান্ত নিয়েছেন এবং এটি যেখানে আপনি গোপনীয়তা সঞ্চয় করেন (তাই এই ফাইলটি সংস্করণ করা উচিত নয়):

from __future__ import absolute_import
from .prod import *  # or .dev if you want dev

##### DJANGO SECRETS
SECRET_KEY = '(3gd6shenud@&57...'
DATABASES['default']['PASSWORD'] = 'f9kGH...'

##### OTHER SECRETS
AWS_SECRET_ACCESS_KEY = "h50fH..."

এই সমাধান সম্পর্কে আমি যা পছন্দ করি তা হ'ল:

  1. গোপনীয়তা বাদে সবকিছুই আপনার সংস্করণ সিস্টেমে রয়েছে
  2. সর্বাধিক কনফিগারেশন এক জায়গায় হল: common.py
  3. প্রোড-নির্দিষ্ট জিনিসগুলি prod.pydev ুকে যায় , দেব-নির্দিষ্ট জিনিসগুলি ভিতরে যায় dev.py। ইহা সাধারণ.
  4. আপনি থেকে পণ্যদ্রব্য ওভাররাইড করতে পারে common.pyমধ্যে prod.pyবা dev.py, এবং আপনি কিছু ওভাররাইড করতে পারে__init__.py
  5. এটা সোজাসুজি পাইথন। কোনও পুনরায় আমদানি হ্যাক নেই।

2
আমি এখনও আমার প্রোজেক্টে কী সেট করতে হবে তা জানার চেষ্টা করছি ws আপনি কি এই বিষয়ে কিছু আলোকপাত করবেন? বিশেষত, আমার ম্যানেজ.পি ফাইলে আমার কাছে ফুবার os.environ.setdefault("DJANGO_SETTINGS_MODULE", "foobar.settings")রয়েছে একটি ফোল্ডার __init__.pyএবং সেটিংস হ'ল এমন একটি ফোল্ডার যা __init__.pyআমার সিক্রেটস এবং ডেভপিপি আমদানি করে যা কমন.পিটি আমদানি করে। সম্পাদনা করুন কিছুই নয়, আমার কোনও মডিউল ইনস্টল হয়নি যা প্রয়োজনীয় ছিল। আমার খারাপ! এটি দুর্দান্ত কাজ করে !!
টিউউউইন

5
দুটি জিনিস: 1) ডিবাগ সেট করা আরও ভাল = আপনার প্রোড.পিটিতে মিথ্যা নয় বরং আপনার ডেভপিপিতে সত্য 2) init .py এ স্যুইচ করার পরিবর্তে DJANGO_SETTINGS_MODULE এনভায়রনমেন্ট var ব্যবহার করে স্যুইচ করুন। এটি PAAS মোতায়েনের (যেমন হেরোকু) সাহায্য করবে।
রব গ্রান্ট

আমি যখন জ্যাঙ্গো 1.8.4 এই সেটআপ ব্যবহার এবং runserver আমি পেতে চেষ্টা "django.core.exceptions.ImproperlyConfigured: SECRET_KEY সেটিংস খালি হতে হবে।", এমনকি Doh আমি SECRET_KEY আমার আছে Init .py ফাইল। আমি কিছু অনুপস্থিত করছি?
পোলার কেয়ার

AWS_SECRET_ACCESS_KEY = os.getenv ("AWS_SECRET_ACCESS_KEY") এর মতো কোনও কিছুর ব্যবহার বেশি সুরক্ষিত নয়? সৎ প্রশ্ন - আপনি কেন এটির সংস্করণ চান না তা আমি জানি তবে অন্য বিকল্পটি হ'ল এটি পরিবেশ থেকে নেওয়া। কোনটি অবশ্যই পরিবেশের পরিবর্তনশীল স্থাপনের প্রশ্নটি উত্থাপন করে তবে অবশ্যই এটি আপনার স্থাপনা ব্যবস্থায় ছেড়ে যেতে পারে, না?
জেএল পেয়ারেট

20

আমি হার্পার শেল্বি পোস্ট করা সেটিংসের "if DEBUG" স্টাইলের কিছুটা পরিবর্তিত সংস্করণ ব্যবহার করি। স্পষ্টতই পরিবেশের উপর নির্ভর করে (উইন / লিনাক্স / ইত্যাদি) কোডটি কিছুটা টুইঙ্ক করার দরকার হতে পারে।

আমি অতীতে "যদি ডিইবিইউজিবি" ব্যবহার করেছিলাম তবে আমি দেখতে পেয়েছিলাম যে মাঝে মাঝে আমাকে ডিউইউবিজি দিয়ে মিথ্যাতে সেট করে পরীক্ষা করা দরকার। পরিবেশটি উত্পাদন বা উন্নয়ন যদি আমি সত্যিই আলাদা করতে চেয়েছিলাম যা আমাকে ডিইবিইউজি স্তর বাছাই করার স্বাধীনতা দিয়েছে।

PRODUCTION_SERVERS = ['WEBSERVER1','WEBSERVER2',]
if os.environ['COMPUTERNAME'] in PRODUCTION_SERVERS:
    PRODUCTION = True
else:
    PRODUCTION = False

DEBUG = not PRODUCTION
TEMPLATE_DEBUG = DEBUG

# ...

if PRODUCTION:
    DATABASE_HOST = '192.168.1.1'
else:
    DATABASE_HOST = 'localhost'

আমি এখনও সেটিংসের এই উপায়টিকে একটি অগ্রগতিতে বিবেচনা করব। জ্যাঙ্গো সেটিংস পরিচালনা করার কোনও এক উপায় আমি দেখিনি যা সমস্ত ঘাঁটিগুলিকে আবৃত করে এবং একই সাথে সেটআপ করা মোটেও ঝামেলা ছিল না (আমি 5x সেটিংস ফাইলগুলির পদ্ধতিতে নিচে নেই)।


এটি এমন এক ধরণের জিনিস যা জাঙ্গোর সেটিংসটি একটি আসল কোড ফাইল হতে দেয় এবং আমি ইঙ্গিত দিচ্ছিলাম। আমি নিজে এর মতো কিছু করি নি, তবে এটি অবশ্যই সমাধানের ধরণের যা আমার চেয়ে ভাল সাধারণ উত্তর হতে পারে।
হার্পার শেলবি

3
আমি কেবল প্রথমবারের জন্য এটিতে ছুটে এসেছি এবং সামান্য পার্থক্যের সাথে আপনার সমাধানটি (সাফল্য!) বেছে নিয়েছি: আমি আমার সিস্টেমের uuid সন্ধান করতে uuid.getnode () ব্যবহার করেছি। সুতরাং আমি পরীক্ষা করে নিচ্ছি uuid.getnode () == 12345678901 (আসলে একটি আলাদা সংখ্যা) আপনার ব্যবহৃত os.en পরিবেশ পরীক্ষার পরিবর্তে। আমাকে বোঝাতে ডকুমেন্টেশনগুলি খুঁজে পাইনি যে OS.en পরিবেশ ['COMPUTERNAME'] প্রতি কম্পিউটারে অনন্য is
জো গোল্টন

os.en वातावरण ['COMPUTERNAME'] অ্যামাজন অ্যাডব্লিউএস উবুন্টুতে কাজ করে না। আমি একটি কিয়ার পেয়েছি।
এভেরেস্ট

ইউআইডি ব্যবহার করার সময় এই সমাধানটি আমার পক্ষে সেরা এবং সহজ হিসাবে প্রমাণিত হয়েছে। এটির জন্য প্রচুর জটিল এবং অতিরিক্ত-মডুলারাইজড প্যাচওয়ার্ক দরকার হয় না। উত্পাদনের পরিবেশে, আপনার এখনও আপনার ডাটাবেস পাসওয়ার্ড এবং SECRET_KEY আলাদা আলাদা ফাইলে রাখা দরকার যা সংস্করণ নিয়ন্ত্রণের বাইরে থাকে।
নিউ এভারেস্ট

os.environ['COMPUTERNAME']দুর্ভাগ্যক্রমে পাইথনএইন কোথাও কাজ করে না। আপনি একটি কী-এরর পান।
nbeuchat

14

আমি একটি সেটিংস_লোকাল.পি এবং একটি সেটিংস_প্রোজন.পি ব্যবহার করি। বেশ কয়েকটি বিকল্পের চেষ্টা করার পরে আমি জানতে পেরেছি যে দুটি সমাধানের ফাইল থাকা সহজ এবং দ্রুত বলে মনে হলে জটিল সমাধানগুলির সাথে সময় নষ্ট করা সহজ।

আপনি যখন নিজের জাজানো প্রকল্পের জন্য mod_python / mod_wsgi ব্যবহার করেন তখন আপনাকে এটিকে আপনার সেটিংস ফাইলটিতে নির্দেশ করতে হবে। আপনি যদি এটিকে আপনার স্থানীয় সার্ভারে অ্যাপ্লিকেশন / সেটিংস_লোকাল.পি এবং আপনার প্রোডাকশন সার্ভারে অ্যাপ্লিকেশন / সেটিংস_প্রডাকশন.পিটিতে নির্দেশ করেন তবে জীবন সহজ হয়ে যায়। কেবল উপযুক্ত সেটিংস ফাইলটি সম্পাদনা করুন এবং সার্ভারটি পুনরায় চালু করুন (জ্যাঙ্গো বিকাশ সার্ভার স্বয়ংক্রিয়ভাবে পুনরায় চালু হবে)।


2
এবং স্থানীয় উন্নয়ন সার্ভার সম্পর্কে কি? জাঙ্গো ওয়েবসারভারকে বলার কোনও উপায় আছে (ব্যবহার করে চালান python manage.py runserver), কোন সেটিংস ফাইলটি ব্যবহার করতে হবে?
akv

2
@akv আপনি রানসভার কমান্ডের শেষে --settings = [মডিউল নাম] (কোনও .পি এক্সটেনশন না) যুক্ত করলে আপনি কোন সেটিংস ফাইলটি ব্যবহার করতে হবে তা নির্দিষ্ট করতে পারেন। আপনি যদি এটি করতে যাচ্ছেন তবে নিজেই একটি পক্ষ নিন এবং উন্নয়নের সেটিংস কনফিগার করে একটি শেল স্ক্রিপ্ট / ব্যাচ ফাইল তৈরি করুন। আমাকে বিশ্বাস করুন, আপনার আঙ্গুলগুলি আপনাকে ধন্যবাদ জানাবে।
টি। স্টোন

এই আমি ব্যবহার সমাধান। উত্পাদন বা বিকাশ উভয়ের জন্য ব্যবহার করার জন্য একটি সেটিংস ফাইল হ্যাক করা অগোছালো
জর্জ গডিক

4
আমি মনে করি উন্নয়নের ক্ষেত্রে সেটিংস.পি ব্যবহার করা ভাল, কারণ আপনাকে এটি সর্বদা নির্দিষ্ট করতে হবে না।
আন্দ্রে বসার্ড

আমি কি এই পদ্ধতিটি অনুমান করে সঠিক হয়েছি যে ডক্সবাংকাঁ.ফ.সেটিংস, প্রক্সি দিয়ে সেটিংস মডিউলটি আমদানি করা দরকার? অন্যথায় সরাসরি লাইভ ঠেকানোর সময় আপনাকে সঠিক সেটিংস ফাইলটিতে নির্দেশ করতে আমদানির ঘোষণাগুলি সম্পাদনা করতে হবে।
গার্ডি

8

টিএল; ডিআর: কৌশলটি হ'ল আপনি যে কোনও os.environmentআমদানির আগে সংশোধন করতে পারেন , এটি জিনিসগুলিকে ব্যাপকভাবে সরল করবে।settings/base.pysettings/<purpose>.py


এই সমস্ত আন্তঃসরিত ফাইলগুলি সম্পর্কে কেবল চিন্তা করা আমার মাথাব্যথা দেয়। মিশ্রণ, আমদানি (কখনও কখনও শর্তযুক্ত), ওভাররাইডিং, ক্ষেত্রে DEBUGসেটিংসে ইতিমধ্যে সেট করা প্যাচিং পরে পরিবর্তিত হয়। কি একটা দুঃস্বপ্ন!

বছরের পর বছর ধরে আমি সমস্ত বিভিন্ন সমাধান দিয়েছি। এগুলি সব কিছুটা কাজ করে তবে পরিচালনা করতে এত কষ্ট হয়। ডব্লিউটিএফ! আমাদের কি সত্যিই সেই ঝামেলা দরকার? আমরা মাত্র একটি settings.pyফাইল দিয়ে শুরু করেছি । এইগুলি সঠিকভাবে সঠিকভাবে একত্রিত করার জন্য এখন আমাদের একটি ডকুমেন্টেশন প্রয়োজন!

আমি আশা করি আমি অবশেষে নীচের সমাধানের সাথে (আমার) মিষ্টি স্পটে আঘাত করব।

আসুন লক্ষ্যগুলি পুনরায় কাটা (কিছু সাধারণ, কিছু আমার)

  1. গোপনীয় বিষয়গুলিকে গোপন রাখুন - এগুলি কোনও রেপোতে সংরক্ষণ করবেন না!

  2. পরিবেশের সেটিংস, 12 ফ্যাক্টর স্টাইলের মাধ্যমে কী এবং গোপনীয় সেট / পড়ুন ।

  3. বুদ্ধিমান ফ্যালব্যাক ডিফল্ট রয়েছে। স্থানীয়ভাবে উন্নয়নের জন্য আপনাকে ডিফল্টগুলির চেয়ে বেশি কিছু লাগবে না।

  4. … তবে ডিফল্ট উত্পাদন নিরাপদ রাখার চেষ্টা করুন। উত্পাদনের জন্য নিরাপদে ডিফল্ট সেটিংস সামঞ্জস্য করার চেয়ে মনে রাখার চেয়ে স্থানীয়ভাবে একটি সেটিং ওভাররাইড মিস করা ভাল।

  5. DEBUGঅন্য সেটিংসে (যেমন জাভাস্ক্রিপ্ট সংক্ষেপিত ব্যবহার করে বা না ব্যবহার করে) এর প্রভাব ফেলতে পারে এমনভাবে সুইচ অফ / অফ করার ক্ষমতা রাখুন ।

  6. স্থানীয় / টেস্টিং / স্টেজিং / প্রোডাকশনের মতো উদ্দেশ্য সেটিংসের মধ্যে স্যুইচিংয়ের ভিত্তিতে DJANGO_SETTINGS_MODULEআরও কিছু করা উচিত ।

  7. … তবে পরিবেশের সেটিংসের মতো আরও প্যারামিটারাইজেশনকে অনুমতি দিন DATABASE_URL

  8. … এছাড়াও তাদের বিভিন্ন উদ্দেশ্য সেটিংস ব্যবহার করতে এবং পাশাপাশি স্থানীয়ভাবে এগুলি চালানোর অনুমতি দিন। স্থানীয় ডেভেলপার মেশিনে উত্পাদন সেটআপ, উত্পাদন ডেটাবেস বা ধোঁয়া পরীক্ষার সংকোচিত স্টাইল শীট অ্যাক্সেস করতে।

  9. যদি কোনও পরিবেশের পরিবর্তনশীল স্পষ্টভাবে সেট না করা হয় (বিশেষত উত্পাদনে যেমন, খালি মূল্য প্রয়োজন)। EMAIL_HOST_PASSWORD

  10. DJANGO_SETTINGS_MODULEজ্যাঙ্গো -অ্যাডমিন স্টার্টপ্রজেক্ট চলাকালীন ম্যানেজ.পিতে ডিফল্ট সেটটিতে প্রতিক্রিয়া জানান

  11. , ন্যূনতম কন্ডিশন রাখুন যদি অবস্থা উদ্দেশ্য পরিবেশ, যুক্ত উদ্দেশ্য সেটিংস ফাইলে ওভাররাইড সেটিংস (উৎপাদন সেট লগ ফাইল এবং এটি আবর্তনের জন্য যেমন।) প্রকার।

না

  1. ডিজেঙ্গোকে ডিজেঙ্গো_এসটিটিঙ্গস_মুডুল সেটিংটি কোনও ফাইল তৈরি করতে দেবেন না।
    ইসস! এটি কেমন মেটা তা ভেবে দেখুন। আপনার যদি কোনও ফাইল (ডকার এনভের মতো) থাকতে হয় তবে একটি জাঙ্গো প্রক্রিয়া শুরু করার আগে এটি পরিবেশে পড়ুন।

  2. আপনার প্রকল্প / অ্যাপ্লিকেশন কোডে DJANGO_SETTINGS_MODULE ওভাররাইড করবেন না, যেমন। হোস্টনাম বা প্রক্রিয়া নামের উপর ভিত্তি করে।
    আপনি যদি পরিবেশের পরিবর্তনশীল সেট করতে অলস হন (যেমন setup.py test) আপনার প্রকল্প কোডটি চালানোর ঠিক আগে সরঞ্জামটি করে এটি করুন।

  3. জ্যাঙ্গো কীভাবে সেটিংস পড়ছে তা যাদু এবং প্যাচিং এড়ান, সেটিংসটিকে প্রাক প্রসেস করুন তবে পরে হস্তক্ষেপ করবেন না।

  4. জটিল যুক্তি ভিত্তিক বাজে কথা নয়। কনফিগারেশন স্থির করা উচিত এবং ফ্লাইতে গণনা করা উচিত নয় material ফ্যালব্যাক ডিফল্ট সরবরাহ করা এখানে যথেষ্ট যুক্তিযুক্ত।
    আপনি কি সত্যিই ডিবাগ করতে চান, কেন স্থানীয়ভাবে আপনার সেটিংসের সঠিক সেট রয়েছে তবে একটি রিমোট সার্ভারে, শতাধিক মেশিনের একটিতে, আলাদাভাবে কিছু গণনা করা হচ্ছে কেন? উহু! ইউনিট পরীক্ষা? সেটিংসের জন্য? সিরিয়াসলি?

সমাধান

আমার কৌশল চমৎকার নিয়ে গঠিত জ্যাঙ্গো-পরিবেশ নিয়ে ব্যবহৃত iniশৈলী ফাইল, প্রদান os.environmentস্থানীয় উন্নয়নের জন্য ডিফল্ট, কিছু ন্যূনতম ও স্বল্প settings/<purpose>.pyআছে একটি ফাইল import settings/base.py পরেos.environment একটি থেকে সেট করা হয় INIফাইল। এটি কার্যকরভাবে আমাদের এক ধরণের সেটিংস ইঞ্জেকশন দেয়।

কৌশলটি এখানে os.environmentআমদানি করার আগে সংশোধন করা settings/base.py

সম্পূর্ণ উদাহরণটি দেখতে রেপোতে যান: https://github.com/wooyek/django-settings-strategy

.
   manage.py
├───data
└───website
    ├───settings
          __init__.py   <-- imports local for compatibility
          base.py       <-- almost all the settings, reads from proces environment 
          local.py      <-- a few modifications for local development
          production.py <-- ideally is empty and everything is in base 
          testing.py    <-- mimics production with a reasonable exeptions
          .env          <-- for local use, not kept in repo
       __init__.py
       urls.py
       wsgi.py

সেটিংস / .env

স্থানীয় উন্নয়নের জন্য খেলাপি। একটি গোপন ফাইল, বেশিরভাগ প্রয়োজনীয় পরিবেশের ভেরিয়েবল সেট করতে। স্থানীয় বিকাশে প্রয়োজনীয় না হলে খালি মানগুলিতে সেগুলি সেট করুন। আমরা এখানে ডিফল্ট সরবরাহ করি এবং নাsettings/base.py পরিবেশ থেকে অনুপস্থিত থাকলে অন্য কোনও মেশিনে ব্যর্থ হওয়ার জন্য ।

সেটিংস / local.py

এখানে যা ঘটে তা হ'ল পরিবেশটি লোড করা settings/.env, এর থেকে সাধারণ সেটিংস আমদানি করা settings/base.py। এর পরে আমরা স্থানীয় উন্নয়নকে স্বাচ্ছন্দ্য করতে কয়েকটিকে ওভাররাইড করতে পারি।

import logging
import environ

logging.debug("Settings loading: %s" % __file__)

# This will read missing environment variables from a file
# We wan to do this before loading a base settings as they may depend on environment
environ.Env.read_env(DEBUG='True')

from .base import *

ALLOWED_HOSTS += [
    '127.0.0.1',
    'localhost',
    '.example.com',
    'vagrant',
    ]

# https://docs.djangoproject.com/en/1.6/topics/email/#console-backend
EMAIL_BACKEND = 'django.core.mail.backends.console.EmailBackend'
# EMAIL_BACKEND = 'django.core.mail.backends.dummy.EmailBackend'

LOGGING['handlers']['mail_admins']['email_backend'] = 'django.core.mail.backends.dummy.EmailBackend'

# Sync task testing
# http://docs.celeryproject.org/en/2.5/configuration.html?highlight=celery_always_eager#celery-always-eager

CELERY_ALWAYS_EAGER = True
CELERY_EAGER_PROPAGATES_EXCEPTIONS = True

সেটিংস / production.py

উত্পাদনের জন্য আমাদের এনভায়রনমেন্ট ফাইলের আশা করা উচিত নয়, তবে আমরা যদি কিছু পরীক্ষা করে নিই তবে এটি থাকা সহজ। তবে যাইহোক, পাছে না কিছু ডিফল্ট ইনলাইন সরবরাহ করে, সুতরাং settings/base.pyসেই অনুযায়ী প্রতিক্রিয়া জানাতে পারে।

environ.Env.read_env(Path(__file__) / "production.env", DEBUG='False', ASSETS_DEBUG='False')
from .base import *

এখানে আগ্রহের মূল বিষয় হ'ল DEBUGএবং ASSETS_DEBUGওভাররাইডগুলি, সেগুলি অজগরটিতে প্রয়োগ করা হবেos.environ পরিবেশ এবং ফাইল থেকে মিস করা থাকলে কেবলমাত্র অজগরটিতে হবে।

এগুলি হবে আমাদের উত্পাদন ডিফল্ট, পরিবেশ বা ফাইলে এগুলি রাখার দরকার নেই, তবে প্রয়োজনে সেগুলি ওভাররাইড করা যেতে পারে। ঝরঝরে!

সেটিংস / base.py

এগুলি আপনার বেশিরভাগ ভ্যানিলা জাঙ্গো সেটিংস, কিছু শর্তযুক্ত এবং প্রচুর পরিবেশ থেকে সেগুলি পড়ার সাথে with প্রায় সমস্ত কিছুই এখানে রয়েছে, সমস্ত উদ্দেশ্যযুক্ত পরিবেশকে সঙ্গতিপূর্ণ এবং যতটা সম্ভব সাদৃশ্য রেখে।

মূল পার্থক্যগুলি নীচে রয়েছে (আমি আশা করি এটি স্ব স্ব ব্যাখ্যাযোগ্য):

import environ

# https://github.com/joke2k/django-environ
env = environ.Env()

# Build paths inside the project like this: os.path.join(BASE_DIR, ...)
BASE_DIR = os.path.dirname(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))

# Where BASE_DIR is a django source root, ROOT_DIR is a whole project root
# It may differ BASE_DIR for eg. when your django project code is in `src` folder
# This may help to separate python modules and *django apps* from other stuff
# like documentation, fixtures, docker settings
ROOT_DIR = BASE_DIR

# Quick-start development settings - unsuitable for production
# See https://docs.djangoproject.com/en/1.11/howto/deployment/checklist/

# SECURITY WARNING: keep the secret key used in production secret!
SECRET_KEY = env('SECRET_KEY')

# SECURITY WARNING: don't run with debug turned on in production!
DEBUG = env('DEBUG', default=False)

INTERNAL_IPS = [
    '127.0.0.1',
]

ALLOWED_HOSTS = []

if 'ALLOWED_HOSTS' in os.environ:
    hosts = os.environ['ALLOWED_HOSTS'].split(" ")
    BASE_URL = "https://" + hosts[0]
    for host in hosts:
        host = host.strip()
        if host:
            ALLOWED_HOSTS.append(host)

SECURE_SSL_REDIRECT = env.bool('SECURE_SSL_REDIRECT', default=False)

# Database
# https://docs.djangoproject.com/en/1.11/ref/settings/#databases

if "DATABASE_URL" in os.environ:  # pragma: no cover
    # Enable database config through environment
    DATABASES = {
        # Raises ImproperlyConfigured exception if DATABASE_URL not in os.environ
        'default': env.db(),
    }

    # Make sure we use have all settings we need
    # DATABASES['default']['ENGINE'] = 'django.contrib.gis.db.backends.postgis'
    DATABASES['default']['TEST'] = {'NAME': os.environ.get("DATABASE_TEST_NAME", None)}
    DATABASES['default']['OPTIONS'] = {
        'options': '-c search_path=gis,public,pg_catalog',
        'sslmode': 'require',
    }
else:
    DATABASES = {
        'default': {
            'ENGINE': 'django.db.backends.sqlite3',
            # 'ENGINE': 'django.contrib.gis.db.backends.spatialite',
            'NAME': os.path.join(ROOT_DIR, 'data', 'db.dev.sqlite3'),
            'TEST': {
                'NAME': os.path.join(ROOT_DIR, 'data', 'db.test.sqlite3'),
            }
        }
    }

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

# django-assets
# http://django-assets.readthedocs.org/en/latest/settings.html

ASSETS_LOAD_PATH = STATIC_ROOT
ASSETS_ROOT = os.path.join(ROOT_DIR, 'assets', "compressed")
ASSETS_DEBUG = env('ASSETS_DEBUG', default=DEBUG)  # Disable when testing compressed file in DEBUG mode
if ASSETS_DEBUG:
    ASSETS_URL = STATIC_URL
    ASSETS_MANIFEST = "json:{}".format(os.path.join(ASSETS_ROOT, "manifest.json"))
else:
    ASSETS_URL = STATIC_URL + "assets/compressed/"
    ASSETS_MANIFEST = "json:{}".format(os.path.join(STATIC_ROOT, 'assets', "compressed", "manifest.json"))
ASSETS_AUTO_BUILD = ASSETS_DEBUG
ASSETS_MODULES = ('website.assets',)

শেষ বিট এখানে শক্তি দেখায়। ASSETS_DEBUGএকটি বুদ্ধিমান ডিফল্ট আছে, যা ওভাররাইড করা যেতে পারে settings/production.pyএমনকি এটি একটি পরিবেশ সেটিং দ্বারা ওভাররাইড করা যেতে পারে! হ্যাঁ!

বাস্তবে আমাদের কাছে গুরুত্বের একটি মিশ্র শ্রেণিবিন্যাস রয়েছে:

  1. সেটিংস / .py - উদ্দেশ্য ভিত্তিতে ডিফল্ট সেট করে, গোপন সংরক্ষণ করে না
  2. সেটিংস / বেস.পি - বেশিরভাগ পরিবেশ দ্বারা নিয়ন্ত্রিত হয়
  3. পরিবেশের সেটিংস প্রক্রিয়া - 12 ফ্যাক্টর বাচ্চা!
  4. সেটিংস / .env - সহজ সূচনার জন্য স্থানীয় ডিফল্ট

আরে জানুস ... সুতরাং .env ফাইলে সমস্ত এপিআই কী এবং লেখক কী এবং পাসওয়ার্ড ইত্যাদি যাবে? ঠিক TWILLIO_API = "abc123" এর মতো? বা TWILLIO_API = env ("TWILLIO_API")?
dbinott

হ্যাঁ, তবে এটি শুধুমাত্র পরিবেশ সেটিংসের জন্য একটি ফলব্যাক। এই ফাইলটি উন্নয়নের কাজে আসে তবে রেপোতে সংরক্ষণ করা হয় না বা উত্পাদনের দিকে ধাক্কা দেওয়া হয় না যেখানে আপনাকে পরিবেশের সেটিংস বা আপনার প্ল্যাটফর্মের সমতুল্য ব্যবহার করা উচিত যা সার্ভার প্রক্রিয়াটির জন্য পরিবেশ সেটিংস পরিবর্তন করে।
জানুস স্কনিইজনি

7

আমি জাঙ্গো-বিভক্ত-সেটিংসের সাহায্যে আমার কনফিগারেশনগুলি পরিচালনা করি ।

এটি ডিফল্ট সেটিংসের জন্য একটি ড্রপ-ইন প্রতিস্থাপন। এটি সহজ, তবুও কনফিগারযোগ্য। এবং আপনার অস্তিত্বের সেটিংসের রিফ্যাক্টরিংয়ের প্রয়োজন নেই।

এখানে একটি ছোট উদাহরণ (ফাইল example/settings/__init__.py):

from split_settings.tools import optional, include
import os

if os.environ['DJANGO_SETTINGS_MODULE'] == 'example.settings':
    include(
        'components/default.py',
        'components/database.py',
        # This file may be missing:
        optional('local_settings.py'),

        scope=globals()
    )

এটাই.

হালনাগাদ

এর সাথে সেটিংস পরিচালনা করার বিষয়ে আমি একটি ব্লগ পোস্ট লিখেছিলাম । একবার দেখুন!djangodjango-split-sttings


1
আমি চেষ্টা করেছিলাম ... একবার আমার জ্যাঙ্গো ইউনিট পরীক্ষা চালানোর চেষ্টা করার পরে আমি প্রাচীরের মধ্যে দৌড়ে গেলাম .. কোন সেটিংস ফাইলটি পড়তে হবে তা নির্দিষ্ট করে কীভাবে নির্দিষ্ট করব তা আমি ঠিক বুঝতে পারি নি
অ্যাবড

আমি আপনার জন্য একটি গিস্ট
sobolevn

আমি ভালো কিছু পেয়েছিলাম এই আমার কোডে, তাই আমি settings.DEBUG পতাকা পরীক্ষা জানতে যদি আমি কাপড় আমদানি ওয়ানা .. যে পতাকা সবসময় মিথ্যাতে জ্যাঙ্গো ইউনিট পরীক্ষা (দেখুন সেট করা হয় এখানে ) যাতে আমার কাজ প্রায় তাদের দিকে ওভাররাইড করতে হয় মত প্রতিটি পরীক্ষার তাই
abbood

যদিও এখানে আরও একটি প্রশ্ন রয়েছে: আমার uwsgi.iniফাইলটির ডেভ / প্রোড জুড়ে বিভিন্ন সেটিংস রয়েছে .. কীভাবে আমার সেটিংস ফাইল থেকে মান বাছাই করা যায় তার কোনও ধারণা?
অ্যাবড

দুঃখিত, আমি সেটআপ পাই না আপনি আরও বিশদ সহ একটি পৃথক প্রশ্ন জিজ্ঞাসা করতে পারেন এবং আমি আপনাকে সাহায্য করার চেষ্টা করব।
sobolevn

6

এই সমাধানগুলির বেশিরভাগ ক্ষেত্রে সমস্যাটি হ'ল আপনি হয় আপনার স্থানীয় সেটিংস সাধারণগুলির আগে প্রয়োগ করেছেন বা তাদের পরে

সুতরাং ভালো জিনিসগুলি ওভাররাইড করা অসম্ভব

  • এনভ-নির্দিষ্ট সেটিংস মেমচেড পুলের জন্য ঠিকানাগুলি সংজ্ঞায়িত করে এবং মূল সেটিংস ফাইলে এই মানটি ক্যাশে ব্যাকএন্ড কনফিগার করতে ব্যবহৃত হয়
  • এনভ-নির্দিষ্ট সেটিংস অ্যাপ্লিকেশনগুলি / মিডলওয়্যারকে ডিফল্ট হিসাবে যুক্ত বা সরিয়ে দেয়

একই সাথে

কনফিগার পার্সার ক্লাসের সাথে "ini" -স্টাইল কনফিগারেশন ফাইল ব্যবহার করে একটি সমাধান প্রয়োগ করা যেতে পারে। এটি একাধিক ফাইল, অলস স্ট্রিং ইন্টারপোলেশন, ডিফল্ট মান এবং অন্যান্য অনেক গুডিকে সমর্থন করে। বেশ কয়েকটি ফাইল লোড হয়ে গেলে আরও বেশি ফাইল লোড করা যায় এবং তাদের মানগুলি যদি পূর্ববর্তী কোনওগুলি ওভাররাইড করে।

আপনি আগের লোড হওয়া কনফিগার ফাইলগুলিতে মেশিনের ঠিকানা, পরিবেশের ভেরিয়েবল এবং এমনকি মানগুলির উপর নির্ভর করে এক বা একাধিক কনফিগারেশন ফাইল লোড করুন। তারপরে আপনি সেটিংসটি পপুলেশন করতে পার্সড মানগুলি ব্যবহার করুন।

আমি সফলভাবে একটি কৌশল ব্যবহার করেছি:

  • একটি ডিফল্ট defaults.iniফাইল লোড করুন
  • মেশিন নাম চেক করুন, এবং সমস্ত ফাইল যা বিপরীত FQDN মিলে সবচেয়ে কম ম্যাচ থেকে দীর্ঘতম ম্যাচ (তাই, আমি লোড করতে লোড net.ini, তারপর net.domain.ini, তারপর net.domain.webserver01.ini, প্রতিটি এক সম্ভবত পূর্ববর্তী মান অগ্রাহ্য করা হবে)। এই অ্যাকাউন্টটি বিকাশকারীদের মেশিনগুলির জন্যও, তাই প্রত্যেকে স্থানীয় উন্নয়নের জন্য তার পছন্দসই ডাটাবেস ড্রাইভার ইত্যাদি সেট আপ করতে পারে
  • "ক্লাস্টারের নাম" ঘোষিত আছে কিনা তা পরীক্ষা করুন এবং সেই ক্ষেত্রে লোড cluster.cluster_name.ini, যা ডেটাবেস এবং ক্যাশে আইপি জাতীয় জিনিস সংজ্ঞায়িত করতে পারে

আপনি যা অর্জন করতে পারবেন তার উদাহরণ হিসাবে, আপনি প্রতি-এনভির জন্য একটি "সাবডোমেন" মান নির্ধারণ করতে পারেন, যা পরে ডিফল্ট সেটিংসে ব্যবহৃত হয় (যেমন hostname: %(subdomain).whatever.net ) সমস্ত প্রয়োজনীয় হোস্টনাম এবং জাজো কাজ করার জন্য প্রয়োজনীয় কুকি জিনিসগুলি সংজ্ঞায়িত করতে।

এটি DRY হিসাবে আমি পেতাম, বেশিরভাগ (বিদ্যমান) ফাইলগুলির মাত্র 3 বা 4 সেটিংস ছিল। এর শীর্ষে আমাকে গ্রাহক কনফিগারেশন পরিচালনা করতে হয়েছিল, সুতরাং গ্রাহক প্রতি এক বা একাধিক কনফিগারেশন ফাইল (ডাটাবেসের নাম, ব্যবহারকারী এবং পাসওয়ার্ড, নির্ধারিত সাবডোমেন ইত্যাদির মতো জিনিস) সহ একটি অতিরিক্ত সেট বিদ্যমান ছিল।

এটি এটিকে কম বা প্রয়োজনীয় হিসাবে স্কেল করতে পারে, আপনি প্রতি-পরিবেশটি কনফিগার করতে চান এমন কীগুলি আপনি কনফিগার ফাইলটিতে রেখেছেন এবং একবার নতুন কনফিগারেশনের প্রয়োজন হলে পূর্ববর্তী মানটি ডিফল্ট কনফিগারেশনে রেখে সেটি ওভাররাইড করুন যেখানে প্রয়োজন.

এই সিস্টেমটি নির্ভরযোগ্য প্রমাণিত হয়েছে এবং সংস্করণ নিয়ন্ত্রণের সাথে ভাল কাজ করে। এটি দীর্ঘকাল ধরে অ্যাপ্লিকেশনগুলির পৃথক দুটি ক্লাস্টার পরিচালনা করতে ব্যবহৃত হয়েছে (মেশিনে জ্যাঙ্গো সাইটের 15 বা আরও পৃথক দৃষ্টান্ত), যেখানে ক্লাস্টারগুলি আকার পরিবর্তন করছে এবং সিসাদমিনের মেজাজের উপর ভিত্তি করে সদস্যরা ... ।


1
আপনি কীভাবে জাঙ্গোর সেটিংসে ইনআই থেকে সেটিংস লোড করবেন তার উদাহরণ রয়েছে?
ক্যালিসিন

Docs.python.org/2/library/configparser.html দেখুন । আপনি একটি পার্সার লোড করতে পারেন config = ConfigParser.ConfigParser() তারপরে আপনার ফাইলগুলি পড়ুন config.read(array_of_filenames)এবং ব্যবহার করে মান পাবেন config.get(section, option)। সুতরাং প্রথমে আপনি আপনার কনফিগারটি লোড করুন এবং তারপরে আপনি সেটিংসের মানগুলি পড়তে এটি ব্যবহার করুন।
21:14

5

আমি লারাভেলের সাথেও কাজ করছি এবং আমি সেখানে বাস্তবায়ন পছন্দ করি। আমি এটি অনুকরণ করার চেষ্টা করেছি এবং টি স্টোন দ্বারা প্রস্তাবিত সমাধানটির সাথে এটি একত্রিত করার চেষ্টা করেছি (উপরে দেখুন):

PRODUCTION_SERVERS = ['*.webfaction.com','*.whatever.com',]

def check_env():
    for item in PRODUCTION_SERVERS:
        match = re.match(r"(^." + item + "$)", socket.gethostname())
        if match:
            return True

if check_env():
    PRODUCTION = True
else:
    PRODUCTION = False

DEBUG = not PRODUCTION

হয়তো এরকম কিছু আপনাকে সহায়তা করবে।


4

মনে রাখবেন যে সেটিংস.পি একটি লাইভ কোড ফাইল। ধরে নিই যে আপনার কাছে প্রোডাক্টে ডিইবিইউজি সেট নেই (যা একটি সেরা অনুশীলন), আপনি এর মতো কিছু করতে পারেন:

if DEBUG:
    STATIC_PATH = /path/to/dev/files
else:
    STATIC_PATH = /path/to/production/files

সুন্দর মৌলিক, তবে আপনি, তাত্ত্বিকভাবে, কেবলমাত্র ডিইবিইউজি - বা আপনি ব্যবহার করতে চান এমন কোনও ভেরিয়েবল বা কোড চেকের ভিত্তিতে জটিলতার যে কোনও স্তরে যেতে পারেন।


4

আমার বেশিরভাগ প্রকল্পের জন্য আমি নিম্নলিখিত প্যাটার্ন ব্যবহার করি:

  1. সেটিংস_বাসে.পিটি তৈরি করুন যেখানে আমি সমস্ত সেটিংসের জন্য সাধারণ সেটিংগুলি সঞ্চয় করি
  2. যখনই আমাকে নির্দিষ্ট প্রয়োজনীয়তার সাথে নতুন পরিবেশ ব্যবহার করার প্রয়োজন হয় আমি নতুন সেটিংস ফাইল তৈরি করি (উদাঃ সেটিংস_লোক্যাল.পি) যা সেটিংস_বেস.পি এর সামগ্রী উত্তরাধিকার সূত্রে প্রাপ্ত এবং যথাযথ সেটিংস ভেরিয়েবলগুলিকে ওভাররাইড / যুক্ত করে ( from settings_base import *)

(কাস্টম সেটিংসে manage.py চালানোর জন্য আপনি কেবল --settings কমান্ড বিকল্প ব্যবহার File: manage.py <command> --settings=settings_you_wish_to_use.py)


3

আমার সেই সমস্যার সমাধানটি ইতিমধ্যে এখানে বর্ণিত কিছু সমাধানের মিশ্রণ হিসাবেও রয়েছে:

  • আমি এমন একটি ফাইল রাখি যার মধ্যে ডেভ এবং প্রোড থাকে local_settings.pycontentUSING_LOCAL = TrueUSING_LOCAL = False
  • ইন settings.pyআমি যে ফাইলে একটি আমদানি করতে পেতে USING_LOCALসেটিং

আমি তারপরে আমার সমস্ত পরিবেশ-নির্ভর সেটিংগুলিকে বেস করছি:

DEBUG = USING_LOCAL
if USING_LOCAL:
    # dev database settings
else:
    # prod database settings

আমি এটি পৃথক করে দুটি পৃথক সেটিংস.পি ফাইল রাখার চেয়ে পছন্দ করি যেহেতু আমি আমার সেটিংসগুলিকে একক ফাইলে কাঠামোগত রাখতে পারছি তবে সেগুলি বেশ কয়েকটি ফাইল জুড়ে ছড়িয়ে পড়ে easier এটি পছন্দ করুন, যখন আমি কোনও সেটিংস আপডেট করি তখন আমি উভয় পরিবেশের জন্য এটি করতে ভুলে যাব না।

অবশ্যই প্রতিটি পদ্ধতির অসুবিধা রয়েছে এবং এটি একটি ব্যতিক্রম নয়। এখানে সমস্যাটি হ'ল আমি local_settings.pyযখনই আমার পরিবর্তনগুলিকে উত্পাদনের দিকে ঠেলে দেই না তখন ফাইলটি ওভাররাইট করতে পারি না , যার অর্থ আমি কেবল সমস্ত ফাইল অন্ধভাবে অনুলিপি করতে পারি না, তবে এটিই আমি বাঁচতে পারি।


3

আমি উপরে উল্লিখিত jpartogi এর একটি প্রকরণ ব্যবহার করি, যা আমি একটু খাটো খুঁজে পাই:

import platform
from django.core.management import execute_manager 

computername = platform.node()

try:
  settings = __import__(computername + '_settings')
except ImportError: 
  import sys
  sys.stderr.write("Error: Can't find the file '%r_settings.py' in the directory containing %r. It appears you've customized things.\nYou'll have to run django-admin.py, passing it your settings module.\n(If the file local_settings.py does indeed exist, it's causing an ImportError somehow.)\n" % (computername, __file__))
  sys.exit(1)

if __name__ == "__main__":
  execute_manager(settings)

মূলত প্রতিটি কম্পিউটারে (উন্নয়ন বা উত্পাদন) আমার কাছে উপযুক্ত হোস্টনেম_সেটিংস.পি ফাইল রয়েছে যা গতিশীলভাবে লোড হয়।


3

জ্যাঙ্গো ক্লাসি সেটিংসও রয়েছে। আমি ব্যক্তিগতভাবে এটির একটি বড় অনুরাগী। এটি জ্যাঙ্গো আইআরসি-র সর্বাধিক সক্রিয় লোকদের দ্বারা নির্মিত। আপনি জিনিস সেট করতে পরিবেশগত vars ব্যবহার করবে।

http://django-classy-settings.readthedocs.io/en/latest/


3

1 - আপনার অ্যাপের ভিতরে একটি নতুন ফোল্ডার তৈরি করুন এবং এতে সেটিংসের নাম দিন।

2 - এখন __init__.pyএটিতে একটি নতুন ফাইল তৈরি করুন এবং এর ভিতরে লিখুন

from .base import *

try:
    from .local import *
except:
    pass

try:
    from .production import *
except:
    pass

3 - নাম ফোল্ডারের সেটিংসে তিনটি নতুন ফাইল তৈরি local.pyএবং production.pyএবং base.py

4 - এর ভিতরে base.py, পূর্ববর্তী settings.pyফোল্ডারের সমস্ত সামগ্রী অনুলিপি করুন এবং আলাদা কিছু দিয়ে এটির নামকরণ করুন, আসুন বলি old_settings.py

5 - বেস.পি এ আপনার সেটিংয়ের নতুন পথটির দিকে নির্দেশ করতে আপনার BASE_DIR পথ পরিবর্তন করুন

পুরানো পথ-> BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))

নতুন পথ -> BASE_DIR = os.path.dirname(os.path.dirname(os.path.dirname(os.path.abspath(__file__)))

এইভাবে, প্রকল্প দির কাঠামোগত হতে পারে এবং উত্পাদন এবং স্থানীয় উন্নয়নের মধ্যে পরিচালনাযোগ্য হতে পারে।


2

settingsবিভিন্ন পরিবেশে বিভিন্ন কনফিগারেশন ব্যবহার করতে, বিভিন্ন সেটিংস ফাইল তৈরি করুন। এবং আপনার স্থাপনার স্ক্রিপ্টে, --settings=<my-settings.py>প্যারামিটার ব্যবহার করে সার্ভারটি শুরু করুন , যার মাধ্যমে আপনি বিভিন্ন পরিবেশে বিভিন্ন সেটিংস ব্যবহার করতে পারেন ।

এই পদ্ধতির ব্যবহারের সুবিধা :

  1. আপনার সেটিংস প্রতিটি পরিবেশের উপর ভিত্তি করে মডুলার হবে

  2. আপনি master_settings.pyবেস কনফিগারেশনটি ধারণ করে আমদানি environmnet_configuration.pyকরতে পারেন এবং সেই পরিবেশে যে মানগুলি পরিবর্তন করতে চান তা ওভাররাইড করতে পারেন।

  3. আপনার যদি বিশাল দল থাকে তবে প্রতিটি বিকাশকারীর নিজস্ব থাকতে পারে local_settings.pyযা তারা সার্ভার কনফিগারেশনটি পরিবর্তন করার কোনও ঝুঁকি ছাড়াই কোড সংগ্রহস্থলে যুক্ত করতে পারে। আপনি এইসব স্থানীয় সেটিংস যোগ করতে পারেন .gitnoreযদি আপনি ব্যবহার Git বা .hginoreআপনি Mercurial জন্য সংস্করণ কন্ট্রোল (অথবা অন্য কোন)। এইভাবে স্থানীয় সেটিংসগুলি এটিকে পরিষ্কার রাখার ক্ষেত্রেও আসল কোড বেসের অংশ হবে না।


2

আমি আমার সেটিংস নীচে বিভক্ত ছিল

settings/
     |
     |- base.py
     |- dev.py
     |- prod.py  

আমাদের 3 টি পরিবেশ রয়েছে

  • দেব
  • উপস্থাপনকারী
  • উৎপাদন

এখন স্পষ্টতই মঞ্চায়ন এবং উত্পাদন সর্বাধিক সম্ভব অনুরূপ পরিবেশ থাকা উচিত। সুতরাং আমরা prod.pyউভয় জন্য রাখা ।

তবে এমন একটি মামলা ছিল যেখানে আমাকে চালনার সার্ভারটি সনাক্ত করতে হয়েছিল একটি প্রোডাকশন সার্ভার। @T। পাথরের উত্তর আমাকে নীচে চেক লিখতে সহায়তা করেছে।

from socket import gethostname, gethostbyname  
PROD_HOSTS = ["webserver1", "webserver2"]

DEBUG = False
ALLOWED_HOSTS = [gethostname(), gethostbyname(gethostname()),]


if any(host in PROD_HOSTS for host in ALLOWED_HOSTS):
    SESSION_COOKIE_SECURE = True
    CSRF_COOKIE_SECURE = True  

1

আমি এটিকে ম্যানেজ.পিতে আলাদা করে পৃথক দুটি সেটিংস ফাইল তৈরি করেছি: লোকাল_সেটিং.পি এবং প্রোড_সেটিংস.পি।

ম্যানেজ.পেইতে আমি সার্ভারটি স্থানীয় সার্ভার বা উত্পাদন সার্ভার কিনা তা যাচাই করে দেখি। এটি যদি স্থানীয় সার্ভার হয় তবে এটি স্থানীয়_সেটিংস.পি লোড করবে এবং এটি প্রোডাকশন সার্ভার এটি প্রোড_সেটিংস.পি লোড করবে। মূলত এটির মতো দেখতে এটি:

#!/usr/bin/env python
import sys
import socket
from django.core.management import execute_manager 

ipaddress = socket.gethostbyname( socket.gethostname() )
if ipaddress == '127.0.0.1':
    try:
        import local_settings # Assumed to be in the same directory.
        settings = local_settings
    except ImportError:
        import sys
        sys.stderr.write("Error: Can't find the file 'local_settings.py' in the directory containing %r. It appears you've customized things.\nYou'll have to run django-admin.py, passing it your settings module.\n(If the file local_settings.py does indeed exist, it's causing an ImportError somehow.)\n" % __file__)
        sys.exit(1)
else:
    try:
        import prod_settings # Assumed to be in the same directory.
        settings = prod_settings    
    except ImportError:
        import sys
        sys.stderr.write("Error: Can't find the file 'prod_settings.py' in the directory containing %r. It appears you've customized things.\nYou'll have to run django-admin.py, passing it your settings module.\n(If the file prod_settings.py does indeed exist, it's causing an ImportError somehow.)\n" % __file__)
        sys.exit(1)

if __name__ == "__main__":
    execute_manager(settings)

আমি সেটিংস ফাইলের ভিতরে প্রচুর ifs না করে সেটিংস ফাইলটিকে দুটি পৃথক ফাইলে আলাদা করা সহজ বলে মনে করেছি।


1

আপনি যদি উইল করেন তবে বিভিন্ন ফাইল বজায় রাখার বিকল্প হিসাবে: আপনি যদি স্থানীয় থেকে সার্ভারে কোডগুলি ঠেকাতে গিট বা অন্য কোনও ভিসিএস ব্যবহার করেন তবে আপনি যা করতে পারেন সেটি সেটিংস ফাইলটি .gitignore এ যুক্ত করুন।

এটি আপনাকে কোনও সমস্যা ছাড়াই উভয় জায়গায় আলাদা আলাদা সামগ্রী থাকতে দেয়। সার্ভারে তাই আপনি সেটিংস.পি এর একটি স্বতন্ত্র সংস্করণ কনফিগার করতে পারেন এবং স্থানীয় অভ্যন্তরে যে কোনও পরিবর্তন করা যায় তা সার্ভারে এবং তার বিপরীতে প্রতিফলিত হয়।

এছাড়াও, এটি গিথুব থেকে সেটিংস.পি ফাইলটি সরিয়ে ফেলবে, বড় দোষ, যা আমি অনেক নবাগতকে করতে দেখলাম।



0

আমি মনে করি সেরা সমাধানটি @ টি দ্বারা প্রস্তাবিত। প্রস্তর, কিন্তু আমি জানি না কেন কেবল জ্যাঙ্গোতে DEBUG পতাকা ব্যবহার করবেন না। আমি আমার ওয়েবসাইটের জন্য নীচের কোডটি লিখি:

if DEBUG:
    from .local_settings import *

সর্বদা সহজ সমাধান জটিলগুলির চেয়ে ভাল।


-2

আমি প্রতিক্রিয়াগুলি এখানে খুব সহায়ক বলে মনে করেছি। (এটি কি আরও সুনির্দিষ্টভাবে সমাধান করা হয়েছে? শেষ প্রতিক্রিয়াটি এক বছর আগে হয়েছিল)) তালিকাভুক্ত সমস্ত পদ্ধতির কথা বিবেচনা করার পরে, আমি এমন একটি সমাধান নিয়ে এসেছি যা আমি এখানে তালিকাভুক্ত দেখিনি।

আমার মানদণ্ডটি ছিল:

  • সবকিছু উত্স নিয়ন্ত্রণে থাকা উচিত। চারপাশে শুয়ে থাকা বিট আমি পছন্দ করি না।
  • আদর্শভাবে, সেটিংস একটি ফাইলে রাখুন। আমি জিনিসগুলি ভুলে যাই যদি আমি তাদের দিকে ঠিক না তাকাই :)
  • মোতায়েনের জন্য কোনও ম্যানুয়াল সম্পাদনা নেই। একক ফ্যাব্রিক কমান্ড দিয়ে পরীক্ষা / ধাক্কা / স্থাপন করতে সক্ষম হওয়া উচিত।
  • উত্পাদনে উন্নয়ন সেটিংস ফাঁস করা এড়িয়ে চলুন।
  • যতটা সম্ভব "স্ট্যান্ডার্ড" (* কাশি *) জ্যাঙ্গো লেআউটকে যতটা সম্ভব সম্ভব রাখুন।

আমি ভেবেছিলাম হোস্ট মেশিনে স্যুইচিং কিছুটা বুদ্ধিমান হয়েছে, তবে তারপরে এখানে আসল সমস্যাটি বিভিন্ন পরিবেশের জন্য আলাদা সেটিংস , এবং আহা মুহুর্তটি পেয়ে গেছে। আমি আমার সেটিংস.পি ফাইলের শেষে এই কোডটি রেখেছি:

try:
    os.environ['DJANGO_DEVELOPMENT_SERVER'] # throws error if unset
    DEBUG = True
    TEMPLATE_DEBUG = True
    # This is naive but possible. Could also redeclare full app set to control ordering. 
    # Note that it requires a list rather than the generated tuple.
    INSTALLED_APPS.extend([
        'debug_toolbar',
        'django_nose',
    ])
    # Production database settings, alternate static/media paths, etc...
except KeyError: 
    print 'DJANGO_DEVELOPMENT_SERVER environment var not set; using production settings'

এইভাবে, অ্যাপ্লিকেশনটি উত্পাদন সেটিংসে ডিফল্ট হয়, যার অর্থ আপনি স্পষ্টভাবে আপনার বিকাশের পরিবেশকে "শ্বেত তালিকাবদ্ধ" করছেন। পরিবেশের পরিবর্তনশীল স্থানীয়ভাবে সেট করতে ভুলে যাওয়া অনেক বেশি নিরাপদ যেটি যদি এর চারপাশের অন্য উপায় ছিল এবং আপনি উত্পাদনতে কিছু সেট করতে ভুলে গিয়েছিলেন এবং কিছু ডেভ সেটিংস ব্যবহার করতে দিন let

স্থানীয়ভাবে বিকাশ করার সময় শেল থেকে বা একটি .বাশ_প্রফাইলে বা যেখানেই হোক:

$ export DJANGO_DEVELOPMENT_SERVER=yep

(বা আপনি যদি উইন্ডোজে বিকাশ করে থাকেন তবে কন্ট্রোল প্যানেলের মাধ্যমে সেট করুন বা যাকে আজকাল যা বলা হয় ... উইন্ডোজ সর্বদা এটিকে এতটাই অস্পষ্ট করে তোলে যে আপনি পরিবেশের পরিবর্তনশীলগুলি সেট করতে পারেন))

এই পদ্ধতির সাথে, ডেভ সেটিংস সমস্ত এক (মানক) স্থানে রয়েছে এবং যেখানে প্রয়োজন সেখানে কেবল উত্পাদনগুলি ওভাররাইড করে। উন্নয়নের সেটিংসের সাথে যে কোনও শোকের উত্স থেকে কোনও প্রভাব ছাড়াই উত্স নিয়ন্ত্রণে প্রতিশ্রুতিবদ্ধ হওয়া সম্পূর্ণ নিরাপদ হওয়া উচিত।


কেবলমাত্র আলাদা কনফিগার ফাইল রক্ষণাবেক্ষণ করা, এবং ডিজেঙ্গো স্ট্যান্ডার্ড এনএইভ ভেরিয়েবল DJANGO_SETTINGS_MODULE ব্যবহার করে নেওয়া ভাল
রব গ্রান্ট
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.