在Django中构造URL的最佳方法

时间:2018-10-06 05:28:07

标签: python django python-3.x

这是我当前用来测试我的网站是在本地部署,在登台还是在生产中的代码:

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 :(得分:1)

根据我将许多Django应用程序部署到生产中的经验,最好的方法是将设置分为不同的模块。在Using Multiple Settings Files一章的Two Scoops of Django中也对此进行了很好的描述。

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

localstageproduction继承自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将使您的生活更加轻松,并允许根据环境动态地配置设置。