我目前正在使用Django项目,我需要访问管理区域以进行本地开发,但希望在部署的站点中禁用它(出于安全原因等)。
如何以编程方式实现此目的(即使用settings.py
)。
非常感谢。
答案 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)。