Làm thế nào để bạn cấu hình Django để phát triển và triển khai đơn giản?


112

Tôi có xu hướng sử dụng SQLite khi phát triển Django , nhưng trên một máy chủ trực tiếp thường cần một thứ gì đó mạnh mẽ hơn ( ví dụ: MySQL / PostgreSQL ). Luôn có những thay đổi khác đối với cài đặt Django: vị trí / cường độ ghi nhật ký khác nhau, đường dẫn phương tiện, v.v.

Làm cách nào để bạn quản lý tất cả những thay đổi này để làm cho việc triển khai trở thành một quy trình tự động, đơn giản?


Tôi không làm bất cứ điều gì cầu kỳ như bất cứ ai khác rõ ràng :). Tôi chỉ tận dụng ORM mà django cung cấp.
Andrew Sledge

1
Câu hỏi đặt ra là làm thế nào để tự động thay đổi các thiết lập để chuyển đổi giữa các môi trường :-)
Guruprasad


Bạn có thể xem gói này: django-split-settings
sobolevn

Câu trả lời:


86

Cập nhật: các cấu hình django đã được phát hành, đây có lẽ là một lựa chọn tốt hơn cho hầu hết mọi người so với việc thực hiện theo cách thủ công.

Nếu bạn muốn làm mọi thứ theo cách thủ công, câu trả lời trước đây của tôi vẫn áp dụng:

Tôi có nhiều tệp cài đặt.

  • settings_local.py - cấu hình máy chủ lưu trữ cụ thể, chẳng hạn như tên cơ sở dữ liệu, đường dẫn tệp, v.v.
  • settings_development.py- cấu hình được sử dụng để phát triển, ví dụ DEBUG = True.
  • settings_production.py- cấu hình được sử dụng để sản xuất, ví dụ SERVER_EMAIL.

Tôi liên kết tất cả những thứ này lại với nhau bằng một settings.pytệp mà trước tiên nhập settings_local.py, sau đó là một trong hai tệp kia. Nó quyết định tải cái nào bằng hai cài đặt bên trong settings_local.py- DEVELOPMENT_HOSTSPRODUCTION_HOSTS. settings.pycác lệnh gọi platform.node()để tìm tên máy chủ của máy mà nó đang chạy, sau đó tìm tên máy chủ đó trong danh sách và tải tệp cài đặt thứ hai tùy thuộc vào danh sách mà nó tìm thấy tên máy trong đó.

Bằng cách đó, điều duy nhất bạn thực sự cần lo lắng là giữ cho settings_local.pytệp được cập nhật với cấu hình máy chủ lưu trữ cụ thể và mọi thứ khác được xử lý tự động.

Kiểm tra một ví dụ ở đây .


2
điều gì sẽ xảy ra nếu dàn dựng (phát triển) và sản xuất trên cùng một máy? platform.node () trả về như cũ sau đó.
gwaramadze

2
Liên kết ví dụ bị lỗi.
Jickson

Ý tưởng tuyệt vời để xác định các thiết lập dựa trên danh sách máy chủ lưu trữ! Một nitpick của tôi là danh pháp (settings_local.py luôn được nhập trước nên bất kỳ cài đặt nào không bị ghi đè, trên thực tế sẽ vẫn hoạt động trong quá trình sản xuất, khiến hậu tố _localkhá khó hiểu) và thực tế là bạn không sử dụng mô-đun (cài đặt /base.py, settings / local.py, settings / production.py). Cũng sẽ là khôn ngoan nếu giữ nó trong một kho lưu trữ riêng biệt ... tốt hơn hết là một dịch vụ an toàn cung cấp thông tin này từ một nguồn chuẩn (có thể là quá mức cần thiết cho hầu hết) ... để máy chủ mới không yêu cầu bản phát hành mới.
DylanYoung

Tốt hơn nữa, nếu bạn đang sử dụng phần mềm quản lý máy, thay vì kiểm tra danh sách máy chủ lưu trữ trong .pytệp và do đó cấp cho mọi máy chủ lưu trữ quyền truy cập thông tin về cấu hình của mọi máy chủ khác, bạn có thể lập mẫu management.py để sử dụng cài đặt thích hợp tệp trong cấu hình triển khai của bạn.
DylanYoung

26

Cá nhân tôi sử dụng một settings.py duy nhất cho dự án, tôi chỉ cần tra cứu tên máy chủ của nó (các máy phát triển của tôi có tên máy chủ bắt đầu bằng "gabriel" nên tôi chỉ có cái này:

import socket
if socket.gethostname().startswith('gabriel'):
    LIVEHOST = False
else: 
    LIVEHOST = True

thì trong các phần khác, tôi có những thứ như:

if LIVEHOST:
    DEBUG = False
    PREPEND_WWW = True
    MEDIA_URL = 'http://static1.grsites.com/'
else:
    DEBUG = True
    PREPEND_WWW = False
    MEDIA_URL = 'http://localhost:8000/static/'

và như thế. Ít đọc hơn một chút, nhưng nó hoạt động tốt và tiết kiệm được việc phải sắp xếp nhiều tệp cài đặt.


Tôi thích ý tưởng này, nhưng nó sẽ không cho phép tôi phân biệt giữa các phiên bản Django khác nhau đang chạy trên cùng một máy chủ. Điều này sẽ xảy ra, chẳng hạn, nếu bạn có các phiên bản khác nhau đang chạy cho các miền phụ khác nhau trên cùng một máy chủ.
Erik

24

Ở cuối settings.py tôi có những thứ sau:

try:
    from settings_local import *
except ImportError:
    pass

Bằng cách này nếu tôi muốn ghi đè cài đặt mặc định, tôi chỉ cần đặt settings_local.py ngay bên cạnh settings.py.


4
Đây là một chút nguy hiểm bởi vì nếu một lỗi đánh máy trong settings_localkết quả trong một ImportError, điều này exceptsẽ nuốt nó âm thầm.
Chris Martin

Bạn có thể kiểm tra tin nhắn No module named...vs cannot import name..., nhưng nó rất giòn. Hoặc, đặt các mục nhập của bạn trong settings_local.py trong các khối thử và nêu ra một ngoại lệ cụ thể hơn: MisconfiguredSettingshoặc điều gì đó có hiệu lực.
DylanYoung

11

Tôi có hai tập tin. settings_base.pytrong đó chứa các cài đặt chung / mặc định và được kiểm tra trong kiểm soát nguồn. Mỗi triển khai có một triển khai riêng biệt settings.py, thực thi from settings_base import *lúc đầu và sau đó ghi đè khi cần thiết.


1
Tôi cũng sử dụng cái này. Nó ưu việt hơn nghịch đảo (dmishe là "from settings_local import *" ở cuối settings.py) vì nó cho phép cài đặt cục bộ truy cập và sửa đổi cài đặt chung nếu cần.
Carl Meyer

3
Nếu settings_local.pylàm điều này from settings import *, nó có thể ghi đè các giá trị trong settings.py. ( settings_local.pytệp phải được nhập vào cuối settings.py).
Seth

Điều đó có thể được thực hiện bằng mọi cách. Hãy xem stackoverflow.com/a/7047633/3124256 ở trên. @Seth Đó là một công thức để nhập vòng tròn.
DylanYoung 13/1217

7

Cách đơn giản nhất mà tôi tìm thấy là:

1) sử dụng settings.py mặc định để phát triển cục bộ và 2) tạo production-settings.py bắt đầu bằng:

import os
from settings import *

Và sau đó chỉ cần ghi đè các cài đặt khác nhau trong sản xuất:

DEBUG = False
TEMPLATE_DEBUG = DEBUG


DATABASES = {
    'default': {
           ....
    }
}

Làm thế nào để django biết để tải cài đặt sản xuất?
AlxVallejo

2

Có phần liên quan, đối với vấn đề triển khai chính Django với nhiều cơ sở dữ liệu, bạn có thể muốn xem qua Djangostack . Bạn có thể tải xuống trình cài đặt hoàn toàn miễn phí cho phép bạn cài đặt Apache, Python, Django, v.v. Là một phần của quá trình cài đặt, chúng tôi cho phép bạn chọn cơ sở dữ liệu bạn muốn sử dụng (MySQL, SQLite, PostgreSQL). Chúng tôi sử dụng rộng rãi các trình cài đặt khi tự động triển khai trong nội bộ (chúng có thể được chạy ở chế độ không giám sát).


1
Ngoài ra, tôi muốn giới thiệu Django Turnkey Linux dựa trên ngăn xếp Ubuntu * NIX với django được cài đặt sẵn.
jochem

1

Tôi có tệp settings.py của mình trong một thư mục bên ngoài. Bằng cách đó, nó không được kiểm tra trong kiểm soát nguồn hoặc bị ghi đè bởi triển khai. Tôi đặt cái này vào tệp settings.py trong dự án Django của tôi, cùng với bất kỳ cài đặt mặc định nào:

import sys
import os.path

def _load_settings(path):    
    print "Loading configuration from %s" % (path)
    if os.path.exists(path):
    settings = {}
    # execfile can't modify globals directly, so we will load them manually
    execfile(path, globals(), settings)
    for setting in settings:
        globals()[setting] = settings[setting]

_load_settings("/usr/local/conf/local_settings.py")

Lưu ý: Điều này rất nguy hiểm nếu bạn không thể tin cậy local_settings.py.


1

Ngoài nhiều tệp cài đặt được Jim đề cập, tôi cũng có xu hướng đặt hai cài đặt vào tệp settings.py của tôi ở trên cùng BASE_DIRBASE_URLđặt thành đường dẫn của mã và URL đến cơ sở của trang web, tất cả các cài đặt khác đều được sửa đổi để tự thêm vào những.

BASE_DIR = "/home/sean/myapp/" ví dụ MEDIA_ROOT = "%smedia/" % BASEDIR

Vì vậy, khi di chuyển dự án tôi chỉ phải chỉnh sửa các cài đặt này chứ không phải tìm kiếm toàn bộ tệp.

Tôi cũng khuyên bạn nên xem xét vải và Capistrano (công cụ Ruby, nhưng nó có thể được sử dụng để triển khai các ứng dụng Django) tạo điều kiện tự động hóa triển khai từ xa.


Ansible là python và cung cấp các cơ sở cung cấp mạnh mẽ hơn nhiều so với Fabric. Họ cũng rất đẹp đôi.
DylanYoung

1

Vâng, tôi sử dụng cấu hình này:

Ở cuối settings.py:

#settings.py
try:
    from locale_settings import *
except ImportError:
    pass

Và trong locale_settings.py:

#locale_settings.py
class Settings(object):

    def __init__(self):
        import settings
        self.settings = settings

    def __getattr__(self, name):
        return getattr(self.settings, name)

settings = Settings()

INSTALLED_APPS = settings.INSTALLED_APPS + (
    'gunicorn',)

# Delete duplicate settings maybe not needed, but I prefer to do it.
del settings
del Settings

1

Rất nhiều câu trả lời phức tạp!

Mọi tệp settings.py đi kèm với:

BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))

Tôi sử dụng thư mục đó để đặt biến DEBUG như thế này (thay thế bằng directoy nơi mã dev của bạn):

DEBUG=False
if(BASE_DIR=="/path/to/my/dev/dir"):
    DEBUG = True

Sau đó, mỗi khi tệp settings.py được di chuyển, GỢI Ý sẽ là Sai và đó là môi trường sản xuất của bạn.

Mỗi khi bạn cần cài đặt khác với cài đặt trong môi trường nhà phát triển của mình, chỉ cần sử dụng:

if(DEBUG):
    #Debug setting
else:
    #Release setting

0

Tôi nghĩ rằng nó phụ thuộc vào kích thước của trang web và liệu bạn có cần phải nâng cấp từ việc sử dụng SQLite hay không, tôi đã sử dụng thành công SQLite trên một số trang web trực tiếp nhỏ hơn và nó chạy rất tốt.


0

Tôi sử dụng môi trường:

if os.environ.get('WEB_MODE', None) == 'production' :
   from settings_production import *
else :
   from settings_dev import *

Tôi tin rằng đây là một cách tiếp cận tốt hơn nhiều, bởi vì cuối cùng bạn cần các cài đặt đặc biệt cho môi trường thử nghiệm của mình và bạn có thể dễ dàng thêm nó vào điều kiện này.


0

Đây là một bài viết cũ hơn nhưng tôi nghĩ rằng nếu tôi thêm librarynó hữu ích, nó sẽ đơn giản hóa mọi thứ.

Sử dụng django-configuration

Bắt đầu nhanh

pip install django-configurations

Sau đó phân lớp các lớp cấu hình.Configuration được bao gồm trong settings.py của dự án của bạn hoặc bất kỳ mô-đun nào khác mà bạn đang sử dụng để lưu trữ các hằng số cài đặt, ví dụ:

# mysite/settings.py

from configurations import Configuration

class Dev(Configuration):
    DEBUG = True

Đặt DJANGO_CONFIGURATIONbiến môi trường thành tên của lớp bạn vừa tạo, ví dụ: trong ~/.bashrc:

export DJANGO_CONFIGURATION=Dev

DJANGO_SETTINGS_MODULEbiến môi trường thành đường dẫn nhập mô-đun như bình thường, ví dụ: trong bash:

export DJANGO_SETTINGS_MODULE=mysite.settings

Ngoài ra, cung cấp --configurationtùy chọn khi sử dụng các lệnh quản lý Django dọc theo các dòng của --settingstùy chọn dòng lệnh mặc định của Django , ví dụ:

python manage.py runserver --settings=mysite.settings --configuration=Dev

Để kích hoạt Django để sử dụng cấu hình của bạn bây giờ bạn phải sửa đổi của bạn manage.py hoặc wsgi.py kịch bản sử dụng các phiên bản django-cấu hình của các chức năng khởi động thích hợp, ví dụ như một điển hình manage.py sử dụng django-cấu hình sẽ trông như thế này:

#!/usr/bin/env python

import os
import sys

if __name__ == "__main__":
    os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'mysite.settings')
    os.environ.setdefault('DJANGO_CONFIGURATION', 'Dev')

    from configurations.management import execute_from_command_line

    execute_from_command_line(sys.argv)

Lưu ý ở dòng 10, chúng tôi không sử dụng công cụ chung django.core.management.execute_from_command_linemà thay vào đó configurations.management.execute_from_command_line.

Điều tương tự cũng áp dụng cho tệp wsgi.py của bạn , ví dụ:

import os

os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'mysite.settings')
os.environ.setdefault('DJANGO_CONFIGURATION', 'Dev')

from configurations.wsgi import get_wsgi_application

application = get_wsgi_application()

Ở đây chúng tôi không sử dụng django.core.wsgi.get_wsgi_applicationchức năng mặc định mà thay vào đó configurations.wsgi.get_wsgi_application.

Đó là nó! Bây giờ bạn có thể sử dụng dự án của mình với management.py và máy chủ kích hoạt WSGI yêu thích của mình.


-2

Trên thực tế, bạn có thể nên cân nhắc việc có các cấu hình giống nhau (hoặc gần giống nhau) cho môi trường phát triển và sản xuất của mình. Nếu không, các tình huống như "Này, nó hoạt động trên máy của tôi" sẽ thỉnh thoảng xảy ra.

Vì vậy, để tự động hóa việc triển khai của bạn và loại bỏ các vấn đề WOMM đó, chỉ cần sử dụng Docker .

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.