如何在部署的Django项目中禁用admin,但在本地开发时保留?
我现在在做一个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...
)