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

Rui*_*ira 31 python django

我目前正在一个Django项目中工作,我需要访问管理区域进行本地开发,但是想在已部署的站点中禁用它(出于安全原因等).

我怎样才能以编程方式实现(使用settings.py).

非常感谢.

Ned*_*der 48

首先,建立一个方案,以便您的生产服务器可以具有与开发服务器不同的设置.一个简单的方法是使用source-control-ignored local_settings.py文件,但有许多更好的方法可以做到这一点.

然后,在settings.py文件中,输入:

ADMIN_ENABLED = True
Run Code Online (Sandbox Code Playgroud)

并在您的仅生产设置文件中,放置:

ADMIN_ENABLED = False
Run Code Online (Sandbox Code Playgroud)

然后在你的urls.py中:

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

  • 此外,使用TEMPLATE_DEBUG跟随默认settings.py的示例并使用"ADMIN_ENABLED = DEBUG"可能会有所帮助,因此您不要忘记将其关闭. (5认同)
  • `从 django.conf 导入设置` (4认同)

J-a*_*u-s 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
]
Run Code Online (Sandbox Code Playgroud)

对于关于附加到 的第二部分INSTALLED_APPS,需要放在 settings.py 文件中,不能放在 urls 文件中。

因此,应该写成:

if ADMIN_ENABLED is True:
    INSTALLED_APPS.append('django.contrib.admin')
Run Code Online (Sandbox Code Playgroud)

如果您settings.之前包含ADMIN_ENABLED,则会出现错误。


mad*_*eon 9

扩展@NedBatchelder的答案,您可能想使用适当的if statement,如下所示:

if settings.ADMIN_ENABLED is True:
    ...
Run Code Online (Sandbox Code Playgroud)

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

if settings.ADMIN_ENABLED is True:
    INSTALLED_APPS.append('django.contrib.admin')
Run Code Online (Sandbox Code Playgroud)

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