如何在部署的Django项目中禁用admin,但在本地开发时保留?

48 投票
3 回答
32704 浏览
提问于 2025-04-16 10:55

我现在在做一个Django项目,需要在本地开发的时候访问管理后台,但在上线后想把它禁用掉(主要是出于安全考虑等原因)。

我该怎么通过代码来实现这个呢(比如说用 settings.py 文件)?

非常感谢!

3 个回答

9

在扩展 @NedBatchelder 的回答时,你可能想用一个合适的 if 语句,像这样:

if settings.ADMIN_ENABLED is True:
    ...

同时,还要从 INSTALLED_APPS = [...] 中移除 'django.contrib.admin',并使用相同的条件:

if settings.ADMIN_ENABLED is True:
    INSTALLED_APPS.append('django.contrib.admin')

这样的话,这个模块就不会被加载了,比如 collectstatic 就不会复制那些只在管理后台用到的不必要的静态文件(比如字体、图片、css、js)。

11

@madneon 的回答非常棒,但需要更新和小修正,不幸的是,建议编辑的队列已经满了。

首先,提到 @Ned Batchelder 的回答时,使用 patterns() 在 Django 1.9 及以上版本中已经不再支持了。

现在的实现方式可以是:

from django.conf import settings
from django.urls import path

urlpatterns = []

if settings.ADMIN_ENABLED is True:
    urlpatterns += [path('admin/', admin.site.urls),]

urlpatterns += [
   # ... Other paths
]

关于第二部分,添加到 INSTALLED_APPS 的内容,需要放在 settings.py 文件中,而不能放在 urls 文件里。

因此,应该这样写:

if ADMIN_ENABLED is True:
    INSTALLED_APPS.append('django.contrib.admin')

如果在 ADMIN_ENABLED 前面加上 settings.,你会遇到错误。

79

首先,建立一个方案,让你的生产服务器和开发服务器有不同的设置。一个简单的方法是使用一个不被版本控制系统跟踪的 local_settings.py 文件,但还有很多更高级的方式可以实现这个目的。

接着,在你的 settings.py 文件中,加入:

ADMIN_ENABLED = True

然后在你的生产环境专用的设置文件中,加入:

ADMIN_ENABLED = False

最后,在你的 urls.py 文件中:

if settings.ADMIN_ENABLED:
    urlpatterns += patterns('',
        (r'^admin/(.*)', include(admin.site.urls)),
        # ..maybe other stuff you want to be dev-only, etc...
        )

撰写回答