513 | | Of course, you may find that you actually want some of the above settings in {{{common.py}}}. Configure however you need for your situtation. |
| 513 | Of course, you may find that you actually want some of the above settings in {{{common.py}}}. Configure however you need for your situation. |
| 514 | |
| 515 | === Simple Package Organization for Environments === |
| 516 | |
| 517 | [http://chesmart.in I] have used a Python package organization similar to those above for per-environment settings, but much simplified: leaving inheritance to be handled by plain Python modules, without deep-merging dictionary magic. Just be explicit! It's easier to know what {{{production.py}}} configures at a glance without having to go dig into data structures in other files. Having per-developer settings is asking for issues with inconsistent configurations to crop up in deployment environments. |
| 518 | |
| 519 | {{{ |
| 520 | #!sh |
| 521 | [myapp]$ tree settings |
| 522 | settings |
| 523 | ├── __init__.py |
| 524 | ├── defaults.py |
| 525 | ├── dev.py |
| 526 | └── production.py |
| 527 | }}} |
| 528 | |
| 529 | The initial {{{settings.py}}} was moved to {{{settings/defaults.py}}}. By default, the settings package will use development configuration, so that local dev Just Works as normal: |
| 530 | |
| 531 | {{{settings/__init__.py}}} |
| 532 | {{{ |
| 533 | #!python |
| 534 | from dev import * |
| 535 | }}} |
| 536 | |
| 537 | {{{settings/dev.py}}} |
| 538 | {{{ |
| 539 | #!python |
| 540 | # Load defaults in order to then add/override with dev-only settings |
| 541 | from defaults import * |
| 542 | |
| 543 | DEBUG = True |
| 544 | # ... etc. |
| 545 | }}} |
| 546 | |
| 547 | For production (or staging, etc.), just add an appropriate module and set Django's conventional [https://docs.djangoproject.com/en/dev/topics/settings/ DJANGO_SETTINGS_MODULE environment variable] in your deployment setup to load it: |
| 548 | |
| 549 | {{{settings/production.py}}} |
| 550 | {{{ |
| 551 | #!python |
| 552 | # Load defaults in order to then add/override with production-only settings |
| 553 | from defaults import * |
| 554 | |
| 555 | DEBUG = False |
| 556 | # ... etc. |
| 557 | }}} |
| 558 | |
| 559 | Wherever appropriate for your deployment (such as an Apache {{{SetEnv}}} directive, include the equivalent of: |
| 560 | |
| 561 | {{{ |
| 562 | #!sh |
| 563 | $ export DJANGO_SETTINGS_MODULE=myapp.settings.production |
| 564 | }}} |
| 565 | |
| 566 | Using {{{django-admin.py}}} in deployment rather than {{{manage.py}}} should automatically put your app's package on {{{sys.path}}} so that an import path qualified this way will work. |
| 567 | |
| 568 | If you must use a {{{settings/local.py}}} for some reason, virtualenvwrapper's {{{postactivate/postdeactivate}}} hooks are a good place to set {{{DJANGO_SETTINGS_MODULE}}} to point to it for local development per-project. It's advisable to eliminate as many potential discrepancies between dev and production configuration as possible, though. |