用Django编程检查网站是本地运行还是服务器运行的最佳方法?

2 投票
1 回答
640 浏览
提问于 2025-04-15 19:29

目前我在我的 settings.py 文件里有这样的设置:

DEBUG = True
LOCAL = True
TEMPLATE_DEBUG = DEBUG

SITE_TITLE = 'Stack Overflow Question'

REMOTE_SITE_URL = "http://************:8080"
LOCAL_SITE_URL  = "http://************:8000"

ADMINS = (
    # ('Your Name', 'your_email@domain.com'),
)

MANAGERS = ADMINS

if LOCAL:
    SITE_URL = LOCAL_SITE_URL
    ROOT_URL = '/mnt/hgfs/Sites/************'
    engine = 'sqlite3'
    dbName = '************.db'
    dbUser = ''
    dbPassword = ''
    dbHost = ''
    dbPort = ''
else:
    SITE_URL = REMOTE_SITE_URL
    ROOT_URL = '/var/www/vhosts/www.*************.com/public/'
    engine = 'mysql'
    dbName = '************'
    dbUser = 'www-data'
    dbPassword = '************'
    dbHost = ''
    dbPort = ''

我的想法是,如果我把 LOCAL=True 改成 false,我就可以在 sqlite3 数据库和保存在服务器上的 mysql 数据库之间切换。但是这样在使用 SVN 的时候就比较麻烦。我希望 settings.py 能够智能地判断它是在服务器上还是在本地运行。有办法检测 URL、IP,或者简单地检查一个只在服务器上存在而本地没有的文件吗?我不仅在寻找解决方案,还希望这个方案不会给服务器带来太大负担。如果每次 Django 渲染页面时都要检查一个文件是否存在,这可能会比较耗资源。有什么建议吗?

1 个回答

5

检查一个文件是否存在并不是每次渲染的时候都会进行。实际上,这个检查只会在你的解释器进程启动的时候发生,而这又取决于你的部署配置。这会受到你的网站服务器设置的各种因素影响。如果你使用的是Apache服务器,主要的参数有MaxRequestPerChild和StartServers等。

举个例子,如果我在一个预先分叉的Apache服务器上设置了

StartServers 8
MaxrequestsPerChild 4000

那么我会在前8个请求中检查这个文件,接着再处理32,000个请求,然后再检查这个文件8次。(是的,我知道这比这要复杂得多。)

关键是,大多数加载你代码的实现不会频繁地重新读取settings.py文件。考虑到这一点,我们可以试试:

import os
if os.uname()[1] == 'my.development.server.com':
    LOCAL = True
else:
    LOCAL = False

撰写回答