Django: Làm thế nào để quản lý cài đặt phát triển và sản xuất?


129

Tôi đã và đang phát triển một ứng dụng cơ bản. Bây giờ ở giai đoạn triển khai, rõ ràng là tôi cần cả cài đặt cục bộ và cài đặt sản xuất.

Sẽ thật tuyệt nếu biết những điều sau:

  • Cách tốt nhất để giải quyết các cài đặt phát triển và sản xuất.
  • Cách giữ các ứng dụng như django-debug-toolbar chỉ trong môi trường phát triển.
  • Bất kỳ mẹo nào khác và phương pháp hay nhất cho cài đặt phát triển và triển khai.

Câu trả lời:


109

Biến DJANGO_SETTINGS_MODULEmôi trường kiểm soát tệp cài đặt Django sẽ tải.

Do đó, bạn tạo các tệp cấu hình riêng biệt cho các môi trường tương ứng của mình (lưu ý rằng tất nhiên chúng có thể import *từ một tệp "cài đặt được chia sẻ" riêng biệt) và sử dụng DJANGO_SETTINGS_MODULEđể kiểm soát cái nào sẽ sử dụng.

Đây là cách thực hiện:

Như đã lưu ý trong tài liệu Django:

Giá trị của DJANGO_SETTINGS_MODULE phải ở cú pháp đường dẫn Python, ví dụ: mysite.settings. Lưu ý rằng mô-đun cài đặt phải nằm trên đường dẫn tìm kiếm nhập Python.

Vì vậy, giả sử bạn đã tạo myapp/production_settings.pymyapp/test_settings.pytrong kho lưu trữ nguồn của mình.

Trong trường hợp đó, bạn sẽ tương ứng đặt DJANGO_SETTINGS_MODULE=myapp.production_settingsđể sử dụng cái trước và DJANGO_SETTINGS_MODULE=myapp.test_settingssử dụng cái sau.


Từ đây trở đi, vấn đề bắt nguồn từ việc thiết lập DJANGO_SETTINGS_MODULEbiến môi trường.

Cài đặt DJANGO_SETTINGS_MODULEbằng script hoặc shell

Sau đó, bạn có thể sử dụng tập lệnh bootstrap hoặc trình quản lý quy trình để tải các cài đặt chính xác (bằng cách thiết lập môi trường) hoặc chỉ cần chạy nó từ trình bao của bạn trước khi khởi động Django : export DJANGO_SETTINGS_MODULE=myapp.production_settings.

Lưu ý rằng bạn có thể chạy quá trình xuất này bất kỳ lúc nào từ một trình bao - nó không cần nằm trong của bạn .bashrchoặc bất cứ thứ gì.

Cài đặt DJANGO_SETTINGS_MODULEbằng Trình quản lý quy trình

Nếu bạn không thích viết một tập lệnh bootstrap thiết lập môi trường (và có những lý do rất tốt để cảm thấy như vậy!), Tôi khuyên bạn nên sử dụng trình quản lý quy trình:


Cuối cùng, lưu ý rằng bạn có thể tận dụng PYTHONPATHbiến để lưu trữ các cài đặt ở một vị trí hoàn toàn khác (ví dụ: trên máy chủ sản xuất, lưu trữ chúng trong /etc/). Điều này cho phép tách cấu hình khỏi các tệp ứng dụng. Bạn có thể muốn hoặc không, điều đó phụ thuộc vào cách ứng dụng của bạn được cấu trúc.


7
Để làm rõ, vì settings.pytệp được lưu trữ SiteName/settings.pytheo mặc định, nếu bạn đặt tệp cài đặt thay thế của mình trong cùng thư mục, dòng được thêm vào bin / kích hoạt sẽ đọc DJANGO_SETTINGS_MODULE="SiteName.test_settings"Nếu không thì câu trả lời xuất sắc!
alexbhandari

2
bởi trùng hợp ngẫu nhiên bạn có biết một hướng dẫn về cách làm này từng bước, tôi mới để Django và đừng bí quyết nơi để thiết lập các DJANGO_SETTINGS_MODULE hoặc PYTHONPATH
Chúa Giêsu Almaral - Hackaprende

Giải pháp này dường như không đúng cho một env chung cư. Không có thùng / kích hoạt trong môi trường chung cư.
Pouya Yousefi

1
@PouyaYousefi: bạn hoàn toàn không cần sử dụng virtualenv để sử dụng câu trả lời này. Câu trả lời thực sự bao gồm hai bước: a) sử dụng các tệp cài đặt riêng biệt và b) sử dụng DJANGO_SETTINGS_MODULEđể chọn tệp bạn muốn sử dụng. Sửa đổi bin/activate là một trong những việc phải làm sau (TBH, dù sao thì tôi cũng không còn nghĩ đây là một ý kiến ​​hay nữa, vì vậy tôi đã rút nó ra), nhưng nó không phải là duy nhất.
Thomas Orozco

Nó cũng hữu ích Nếu bạn đang sử dụng Django trong phiên bản cộng đồng pycharm và bạn cần chạy thử nghiệm đơn vị trên cả dòng lệnh và cộng đồng pycharm một cách chính xác. Giả sử bạn chỉ tạo một tệp cấu hình đơn giản trong myapp / settings.py trong kho lưu trữ nguồn của bạn. Trong trường hợp đó, bạn sẽ đặt “DJANGO_SETTINGS_MODULE = myapp.settings” trong menu RUN / Chỉnh sửa cấu hình / biến Môi trường để sau này sử dụng biến này để chạy các trường hợp thử nghiệm.
F.Tamy

58

Theo mặc định, hãy sử dụng cài đặt sản xuất, nhưng hãy tạo một tệp được gọi settings_dev.pytrong cùng một thư mục với settings.pytệp của bạn . Thêm ghi đè ở đó, chẳng hạn như DEBUG=True.

Trên máy tính sẽ được sử dụng để phát triển, hãy thêm cái này vào ~/.bashrctệp của bạn :

export DJANGO_DEVELOPMENT=true

Ở cuối settings.pytệp của bạn , hãy thêm phần sau.

# Override production variables if DJANGO_DEVELOPMENT env variable is set
if os.environ.get('DJANGO_DEVELOPMENT'):
    from settings_dev import *  # or specific overrides

(Lưu ý rằng *thường nên tránh nhập bằng Python)

Theo mặc định, máy chủ sản xuất sẽ không ghi đè bất cứ thứ gì. Làm xong!

So với các câu trả lời khác, câu trả lời này đơn giản hơn vì nó không yêu cầu cập nhật PYTHONPATHhoặc cài đặt DJANGO_SETTINGS_MODULEmà chỉ cho phép bạn làm việc trên một dự án django tại một thời điểm.


8
Làm thế nào đây không phải là câu trả lời chính xác? SO thực sự là một mớ hỗn độn ngày nay. Ty CS01
codyc4321

if os.environ.get('DJANGO_DEVELOPMENT', 'true')cũng hoạt động. Tôi đề cập đến điều này chỉ vì is not truephương pháp trên không nhập được cho tôi trên Python 3.6.
brt

1
@brt đây là một ý tưởng tồi: nó sẽ luôn sử dụng DEVcài đặt của bạn , điều này sẽ làm rò rỉ dữ liệu riêng tư trên máy chủ công cộng. Bạn thực sự chỉ muốn kiểm tra xem DJANGO_DEVELOPMENTbiến môi trường có tồn tại hay không (tức là is not None).
cs01

Cảm ơn vì thông tin, @ cs01. Tôi nhận ra mình đã làm sai điều gì đó khi làm nổ tung trang web của mình khi tải cài đặt không chính xác, nhưng tôi không chắc tại sao settings_dev.pylại tải trên máy chủ.
brt

2
@ cs01 Tôi sẽ đi xa hơn để đảm bảo rằng nó tồn tại và trung thực, bằng cách bỏ is not Noneséc. Cũng os.getenvlà tốc ký
Tjorriemorrie

35

Tôi thường có một tệp cài đặt cho mỗi môi trường và một tệp cài đặt được chia sẻ:

/myproject/
  settings.production.py
  settings.development.py
  shared_settings.py

Mỗi tệp môi trường của tôi có:

try:
    from shared_settings import *
except ImportError:
    pass

Điều này cho phép tôi ghi đè cài đặt được chia sẻ nếu cần (bằng cách thêm các sửa đổi bên dưới khổ thơ đó).

Sau đó, tôi chọn các tệp cài đặt sẽ sử dụng bằng cách liên kết tệp đó với settings.py:

ln -s settings.development.py settings.py

2
Làm thế nào để bạn đối phó với việc cấm pep8 import *? Bạn có tắt kiểm tra đó không? Tôi đã bọc nhập khẩu này trong một exec()nhưng sau đó tôi không thể có điều kiện trên các biến mà không được định nghĩa trong tập tin này, cũng không phải tôi có thể alter làm INSTALLED_APPSbiến vì nó "không xác định"
Mikhail

11
Chúng tôi không sử dụng các tệp cài đặt của mình, bởi vì chúng không thực sự mã quá nhiều vì chúng được cấu hình được thể hiện bằng Python.
Daniel Watkins

17

Đây là cách tôi thực hiện trong 6 bước đơn giản:

  1. Tạo một thư mục bên trong thư mục dự án của bạn và đặt tên cho nó settings.

    Cấu trúc dự án:

    myproject/
           myapp1/
           myapp2/              
           myproject/
                  settings/
  2. Tạo bốn tệp python bên trong settingsthư mục __init__.py, cụ thể là base.py, dev.pyprod.py

    Tệp cài đặt:

    settings/
         __init__.py
         base.py
         prod.py
         dev.py 
  3. Mở __init__.pyvà điền vào nó với nội dung sau:

    init .py:

    from .base import *
    # you need to set "myproject = 'prod'" as an environment variable
    # in your OS (on which your website is hosted)
    if os.environ['myproject'] == 'prod':
       from .prod import *
    else:
       from .dev import *
  4. Mở base.pyvà điền vào nó với tất cả các cài đặt chung (sẽ được sử dụng trong cả sản xuất cũng như phát triển.), Ví dụ:

    base.py:

    import os
    ...
    INSTALLED_APPS = [...]
    MIDDLEWARE = [...]
    TEMPLATES = [{...}]
    ...
    STATIC_URL = '/static/'
    STATIC_ROOT = os.path.join(BASE_DIR, 'staticfiles')
    MEDIA_ROOT = os.path.join(BASE_DIR, '/path/')
    MEDIA_URL = '/path/'
  5. Mở dev.pyvà bao gồm những thứ cụ thể cho sự phát triển, ví dụ:

    dev.py:

    DEBUG = True
    ALLOWED_HOSTS = ['localhost']
    ...
  6. Mở prod.pyvà bao gồm những thứ cụ thể cho sản xuất, ví dụ:

    prod.py:

    DEBUG = False
    ALLOWED_HOSTS = ['www.example.com']
    LOGGING = [...]
    ...

10

Tạo nhiều settings*.pytệp, ngoại suy các biến cần thay đổi cho mỗi môi trường. Sau đó, ở cuối settings.pytệp chính của bạn :

try:
  from settings_dev import *
except ImportError:
  pass

Bạn giữ các settings_*tệp riêng biệt cho từng giai đoạn.

Ở đầu settings_dev.pytệp của bạn , hãy thêm cái này:

import sys
globals().update(vars(sys.modules['settings']))

Để nhập các biến mà bạn cần sửa đổi.

Mục wiki này có nhiều ý tưởng hơn về cách phân chia cài đặt của bạn.


Cảm ơn Burham! Khi triển khai ứng dụng, tôi chỉ cần xóa tệp settings_dev để xem cài đặt triển khai của mình đang hoạt động?
Kristian Roebuck

Có, hoặc thay thế nhập bằngsettings_prod.py
Burhan Khalid

1
Mặc dù vậy, việc chỉnh sửa tệp master settings.py trên một triển khai có nghĩa là nó sẽ xung đột với quyền kiểm soát phiên bản, vì vậy đây không nhất thiết là cách tốt nhất. Tôi muốn nói rằng lựa chọn của Thomas Orozco là tốt nhất - bạn có thể đặt DJANGO_SETTINGS_MODULE trong tập lệnh postactivate virtualenv của bạn hoặc trong thiết lập gunicorn hoặc mod_wsgi của bạn
Steve Jalim

1
Có lẽ cần phải đề cập rằng bạn không bao giờ thêm vào kiểm soát nguồn các tệp theo giai đoạn cụ thể. Tôi giả định rằng điều đó được hiểu rằng bạn sẽ không đẩy các cài đặt xung quanh cụ thể cho một giai đoạn của dự án.
Burhan Khalid

Nếu bạn đang sử dụng virtualenv, nó thường sẽ mặc định là {{project_name}}. Settings. Vì vậy, 'cài đặt' sẽ không phải là một chìa khóa trong sys.modules. Nó sẽ là 'myproject.settings' (hoặc bất kỳ tên dự án của bạn là gì). Bạn có thể sử dụng modname = "%s.settings" % ".".join(__name__.split('.')[:-1])để lấy tên mô-đun đầy đủ và sau đó globals().update(vars(sys.modules[modname])). Tôi thấy điều đó phù hợp với tôi. Tất nhiên, bỏ qua một chút về việc xác định theo chương trình tên mô-đun có lợi cho một chuỗi có lẽ cũng sẽ hoạt động trong hầu hết các trường hợp.
Eric

9

Tôi sử dụng các cấu hình django tuyệt vời và tất cả các cài đặt được lưu trữ trong settings.py:

from configurations import Configuration

class Base(Configuration):
    # all the base settings here...
    BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
    ...

class Develop(Base):
    # development settings here...
    DEBUG = True 
    ...

class Production(Base):
    # production settings here...
    DEBUG = False

Để cấu hình dự án Django, tôi chỉ làm theo các tài liệu .


7

Đây là phương pháp chúng tôi sử dụng:

  • một settingsmô-đun để chia cài đặt thành nhiều tệp để dễ đọc;
  • một .env.jsontệp để lưu trữ thông tin xác thực và tham số mà chúng tôi muốn loại trừ khỏi kho lưu trữ git của chúng tôi hoặc dành riêng cho môi trường;
  • một env.pytệp để đọc .env.jsontệp

Xem xét cấu trúc sau:

...
.env.json           # the file containing all specific credentials and parameters
.gitignore          # the .gitignore file to exclude `.env.json`
project_name/       # project dir (the one which django-admin.py creates)
  accounts/         # project's apps
    __init__.py
    ...
  ...
  env.py            # the file to load credentials
  settings/
    __init__.py     # main settings file
    database.py     # database conf
    storage.py      # storage conf
    ...
venv                # virtualenv
...

Với .env.jsonnhư:

{
    "debug": false,
    "allowed_hosts": ["mydomain.com"],
    "django_secret_key": "my_very_long_secret_key",
    "db_password": "my_db_password",
    "db_name": "my_db_name",
    "db_user": "my_db_user",
    "db_host": "my_db_host",
}

project_name/env.py:

<!-- language: lang-python -->
import json
import os


def get_credentials():
    env_file_dir = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
    with open(os.path.join(env_file_dir, '.env.json'), 'r') as f:
        creds = json.loads(f.read())
    return creds


credentials = get_credentials()

Chúng tôi có thể có các cài đặt sau:

<!-- language: lang-py -->
# project_name/settings/__init__.py
from project_name.env import credentials
from project_name.settings.database import *
from project_name.settings.storage import *
...

SECRET_KEY = credentials.get('django_secret_key')

DEBUG = credentials.get('debug')

ALLOWED_HOSTS = credentials.get('allowed_hosts', [])

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',

    ...
]

if DEBUG:
    INSTALLED_APPS += ['debug_toolbar']

...

# project_name/settings/database.py
from project_name.env import credentials

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.postgresql_psycopg2',
        'NAME': credentials.get('db_name', ''),
        'USER': credentials.get('db_user', ''),
        'HOST': credentials.get('db_host', ''),
        'PASSWORD': credentials.get('db_password', ''),
        'PORT': '5432',
    }
}

lợi ích của giải pháp này là:

  • thông tin đăng nhập và cấu hình cụ thể của người dùng để phát triển cục bộ mà không cần sửa đổi kho lưu trữ git;
  • cấu hình môi trường cụ thể , bạn có thể có ví dụ ba môi trường khác nhau với ba môi trường khác nhau .env.jsonnhư dev, trì trệ và sản xuất;
  • thông tin đăng nhập không có trong kho lưu trữ

Tôi hy vọng điều này sẽ giúp, chỉ cho tôi biết nếu bạn thấy bất kỳ cảnh báo nào với giải pháp này.


giả sử envthay thế bằng dev, prodv.v.? Điều gì xảy ra trong settings.pytệp cũ ? Có gì trong storage.pydatabase.py?
dbinott

Xin chào @dbinott, bạn có thể dễ dàng cập nhật env.pytệp để bạn có thể chọn, với một biến môi trường, tệp nào sẽ tải
Charlesthk

Ví dụ: conf = os.environ.get ('CONF', '') file_ = f ".env. {Conf} .json"
Charlesthk

Tại sao bạn lại json trái ngược với kiểu dữ liệu python gốc?
oanh tạc

4

Tôi sử dụng cấu trúc tệp folloring:

project/
   ...
   settings/
   settings/common.py
   settings/local.py
   settings/prod.py
   settings/__init__.py -> local.py

Vì vậy, __init__.pylà một liên kết (ln trong unix hoặc mklink trong cửa sổ) để local.pyhoặc có thể đến prod.pyđể cấu hình vẫn còn trong project.settingsmô-đun được sạch sẽ và có tổ chức, và nếu bạn muốn sử dụng một cấu hình đặc biệt mà bạn có thể sử dụng các biến môi trường DJANGO_SETTINGS_MODULEđể project.settings.prodnếu bạn cần để chạy một lệnh cho môi trường sản xuất.

Trong các tệp prod.pylocal.py:

from .shared import *

DATABASE = {
    ...
}

shared.pytệp sẽ giữ ở dạng chung mà không có cấu hình cụ thể.


3

xây dựng câu trả lời của cs01:

nếu bạn đang gặp sự cố với biến môi trường, hãy đặt giá trị của nó thành một chuỗi (ví dụ: tôi đã làm DJANGO_DEVELOPMENT="true").

Tôi cũng đã thay đổi quy trình làm việc của tệp cs01 như sau:

#settings.py
import os
if os.environ.get('DJANGO_DEVELOPMENT') is not None:
    from settings_dev import * 
else:
    from settings_production import *
#settings_dev.py
development settings go here
#settings_production.py
production settings go here

Bằng cách này, Django không phải đọc toàn bộ tệp cài đặt trước khi chạy tệp cài đặt thích hợp. Giải pháp này rất hữu ích nếu tệp sản xuất của bạn cần những thứ chỉ có trên máy chủ sản xuất của bạn.

Lưu ý: trong Python 3, các tệp được nhập cần phải có phần .nối thêm (ví dụ from .settings_dev import *:)


1

Nếu bạn muốn giữ lại 1 tệp cài đặt và hệ điều hành phát triển của bạn khác với hệ điều hành sản xuất, bạn có thể đặt tệp này ở cuối settings.py:

from sys import platform
if platform == "linux" or platform == "linux2":
    # linux
    # some special setting here for when I'm on my prod server
elif platform == "darwin":
    # OS X
    # some special setting here for when I'm developing on my mac
elif platform == "win32":
    # Windows...
    # some special setting here for when I'm developing on my pc

Đọc thêm: Làm cách nào để kiểm tra hệ điều hành bằng Python?


1

Điều này dường như đã được giải đáp, tuy nhiên, một phương pháp mà tôi sử dụng kết hợp với kiểm soát phiên bản như sau:

Thiết lập tệp env.py trong cùng thư mục với cài đặt trên môi trường phát triển cục bộ của tôi mà tôi cũng thêm vào .gitignore:

env.py:

#!usr/bin/python

DJANGO_ENV = True
ALLOWED_HOSTS = ['127.0.0.1', 'dev.mywebsite.com']

.gitignore:

mywebsite/env.py

settings.py:

if os.path.exists(os.getcwd() + '/env.py'):
    #env.py is excluded using the .gitignore file - when moving to production we can automatically set debug mode to off:
    from env import *
else:
    DJANGO_ENV = False

DEBUG = DJANGO_ENV

Tôi chỉ thấy điều này hoạt động và thanh lịch hơn nhiều - với env.py, thật dễ dàng để xem các biến môi trường cục bộ của chúng tôi và chúng tôi có thể xử lý tất cả những điều này mà không cần nhiều tệp settings.py hoặc các tệp tương tự. Phương pháp này cho phép sử dụng tất cả các loại biến môi trường cục bộ mà chúng tôi không muốn đặt trên máy chủ sản xuất của mình. Sử dụng .gitignore thông qua kiểm soát phiên bản, chúng tôi cũng đang giữ cho mọi thứ được tích hợp liền mạch.


Giải pháp đơn giản nhất. Người ta cũng có thể xác định mọi thứ trong mộtConfigenv.py tệp bên trong lớp . Sau đó, thay vì một import *, mô-đun có thể được nhập bằng from env import Config. Bằng cách này, bạn cũng không cần phải sử dụng nếu os.pathkiểm tra mà làm cho toàn bộ việc này đơn giản hơn nhiều.
Siddharth Pant

0

Sử dụng settings.pycho sản xuất. Trong cùng một thư mục tạo settings_dev.pycho ghi đè.

# settings_dev.py

from .settings import * 

DEBUG = False

Trên máy phát triển, hãy chạy ứng dụng Django của bạn với:

DJANGO_SETTINGS_MODULE=<your_app_name>.settings_dev python3 manage.py runserver

Trên một máy sản xuất chạy như thể bạn chỉ có settings.pyvà không có gì khác.

ƯU ĐIỂM

  1. settings.py (được sử dụng để sản xuất) là hoàn toàn bất khả tri đối với thực tế là bất kỳ môi trường nào khác thậm chí tồn tại.
  2. Để biết sự khác biệt giữa sản phẩm và nhà phát triển, bạn chỉ cần xem xét một vị trí duy nhất - settings_dev.py. Không cần tập hợp các cấu hình rải rác settings_prod.py, settings_dev.pysettings_shared.py.
  3. Nếu ai đó thêm cài đặt vào cấu hình sản phẩm của bạn sau khi khắc phục sự cố sản xuất, bạn có thể yên tâm rằng cài đặt đó cũng sẽ xuất hiện trong cấu hình nhà phát triển của bạn (trừ khi bị ghi đè rõ ràng). Do đó, sự khác biệt giữa các tệp cấu hình khác nhau sẽ được giảm thiểu.

0

Đối với vấn đề thiết lập tệp, tôi chọn sao chép

Project
   |---__init__.py   [ write code to copy setting file from subdir to current dir]
   |---settings.py  (do not commit this file to git)
   |---setting1_dir
   |         |--  settings.py
   |---setting2_dir
   |         |--  settings.py

Khi bạn chạy django, __init__py sẽ được chạy. Tại thời điểm này, settings.py in setting1_dirsẽ thay thếsettings.py in Project .

Làm thế nào để chọn env khác nhau?

  • sửa đổi __init__.py trực tiếp.
  • tạo một tệp bash để sửa đổi __init__.py .
  • sửa đổi env trong linux, và sau đó cho phép __init__.pyđọc biến này.

Tại sao lại sử dụng cách này?

Bởi vì tôi không thích quá nhiều tệp trong cùng một thư mục, quá nhiều tệp sẽ gây nhầm lẫn cho các đối tác khác và không tốt cho IDE. (IDE không thể tìm thấy tệp chúng tôi sử dụng)

Nếu bạn không muốn xem tất cả các chi tiết này, bạn có thể chia dự án thành hai phần.

  1. tạo công cụ nhỏ của bạn như Spring Initializr, chỉ để thiết lập dự án của bạn. (làm như sao chép tệp)
  2. mã dự án của bạn

0

Tôi đang sử dụng tệp app.yaml khác để thay đổi cấu hình giữa các môi trường trong công cụ ứng dụng đám mây của google.

Bạn có thể sử dụng điều này để tạo kết nối proxy trong lệnh terminal của mình:

./cloud_sql_proxy -instances=<INSTANCE_CONNECTION_NAME>=tcp:1433

https://cloud.google.com/sql/docs/sqlserver/connect-admin-proxy#macos-64-bit

Tệp: app.yaml

# [START django_app]
service: development
runtime: python37

env_variables:
  DJANGO_DB_HOST: '/cloudsql/myproject:myregion:myinstance'
  DJANGO_DEBUG: True

handlers:
# This configures Google App Engine to serve the files in the app's static
# directory.
- url: /static
  static_dir: static/

# This handler routes all requests not caught above to your main app. It is
# required when static routes are defined, but can be omitted (along with
# the entire handlers section) when there are no static files defined.
- url: /.*
  script: auto
# [END django_app]

-1

Đây là giải pháp của tôi, với các môi trường khác nhau dành cho nhà phát triển, thử nghiệm và sản phẩm

import socket

[...]

DEV_PC = 'PC059'
host_name = socket.gethostname()

if host_name == DEV_PC:
   #do something
   pass
elif [...]
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.