Лучший способ построить URL в Django - PullRequest
0 голосов
/ 06 октября 2018

Вот код, который я сейчас использую, чтобы проверить, развернут ли мой веб-сайт локально, в стадии подготовки или в процессе производства:

def get_base_url(request=None):
    BASE_URL = request.META.get('HTTP_HOST') if request else settings.STATIC_SITE_URL
    if not BASE_URL.startswith('http'):
        BASE_URL = 'http://' + BASE_URL # such as "localhost:8000"
    return BASE_URL

И чтобы сделать что-то вроде отправки ссылки для сброса пароля, ябудет делать:

BASE_URL = get_base_url(request)
PATH = BASE_URL.rstrip('/') + reverse('logged_in')

Есть ли более чистый способ сделать это?Я попробовал несколько других способов, но это, кажется, возвращает наиболее правильный и последовательный результат.

1 Ответ

0 голосов
/ 06 октября 2018

Из моего опыта развертывания многих приложений Django в производство наилучшим подходом было бы разделение настроек на разные модули.Это также очень хорошо описано в Два совка Джанго в главе Using Multiple Settings Files.

settings/
    base.py
    local.py
    stage.py
    production.py

local, stage, production наследуются от base.

Например local.py:

from .base import *

DEBUG = True

EMAIL_BACKEND = 'django.core.mail.backends.console.EmailBackend'

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.postgresql_psycopg2',
        'NAME': 'db_name',
        'HOST': 'localhost',
    }
}

INSTALLED_APPS += ['debug_toolbar', ]

BASE_URL = 'http://localhost:8080/'

Например production.py:

from .base import *

DEBUG = False

...

BASE_URL = 'https://example.com'

Например stage.py:

from .base import *

DEBUG = False

BASE_URL = 'https://stage.example.com'

После этого вы можете просто установить BASE_URL для каждой конкретной среды в каждом файле настроек и получать доступ с settings.BASE_URL везде, где вы хотите.

If сделает вашу жизнь намного проще и позволит настраивать ваши настройки в зависимости от средыочень динамично.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...