如何在已部署的项目中禁用Django的管理员,但是将其保留用于本地开发?

时间:2011-01-30 20:17:07

标签: python django

我目前正在使用Django项目,我需要访问管理区域以进行本地开发,但希望在部署的站点中禁用它(出于安全原因等)。

如何以编程方式实现此目的(使用settings.py)。

非常感谢。

3 个答案:

答案 0 :(得分:45)

首先,建立一个方案,以便您的生产服务器可以具有与开发服务器不同的设置。一个简单的方法是使用source-control-ignored 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...
        )

答案 1 :(得分:1)

@madneon的答案很棒,但需要更新和更正,很遗憾,建议的编辑队列已满。

对于第一部分,由于它暗示使用@Ned Batchelder的答案,因此在Django 1.9及更高版本中不再支持使用patterns()

当前实现可能如下:

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')

如果在settings.之前加上ADMIN_ENABLED,则会出现错误。

答案 2 :(得分:0)

扩展@NedBatchelder 的答案,您可能要使用正确的if statement,如下所示:

if settings.ADMIN_ENABLED is True:
    ...

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

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

这样,模块将不会被加载,例如。 collectstatic不会复制仅在管理员中使用的不必要的静态文件(字体,图像,css,js)。