如何在 Django 中重命名 "admin" 个静态文件?

How to rename "admin" static files in Django?

加载 Django 管理页面时,加载默认的 Django 管理 css / js 文件。例如,example.com/staticfiles/admin/css/base.css.

我启用了默认的 Amazon WAF(防火墙)规则,该规则会阻止对 URL 中包含单词 "admin" 的页面的所有访问。到目前为止这一切都很好——因为大多数机器人都喜欢寻找 /admin 域。

然而,这最终会阻止 Django 管理员。我可以使用 urls.py 中的一行代码将 Django 管理员 url 重命名为 /manager,但是我不知道如何更改管理员静态文件的文件路径。由于所有静态文件都被阻止,我目前在我的管理员中得到原始的、无样式的 HTML。

理想情况下,在 settings.py 我可以写:

ADMIN_FOLDER_NAME = 'manager'

然后

example.com/staticfiles/admin/css/base.css 将被重写为 example.com/staticfiles/manager/css/base.css.

如何让 Django 在不同的文件夹中查找管理文件?

备注

我不是在问如何重命名 url 以访问管理页面。我说的是管理静态文件。下面的代码确实更改了管理页面 url,但没有更改静态文件的 url。

urlpatterns += [url(r'^newadminurl', admin.site.urls)]

您可能已经在 example.com/staticfiles/admin/css/base.css 中注意到,url 基于文件夹结构。

此外,应该注意的是,在 django 管理模板中,据说静态文件路径会查找名为 admin 的文件夹,如下所示:{% static "admin/css/base.css" %}(管理静态文件路径是 hard-coded).

# a line from admin/base.html
<link rel="stylesheet" type="text/css" href="{% block stylesheet %}{% static "admin/css/base.css" %}{% endblock %}">

这意味着您无法更改 example.com/staticfiles/ 之后的管理静态文件路径。

但是,可以通过复制模板目录来完成

  • 将模板目录从 venv/Lib/site-packages/django/contrib/admin/ 复制到项目基础文件夹
  • 找到所有出现的 {% static "admin/ 并在模板中将 {% static "admin/ 替换为 {% static "manager/。需要注意不要更改模板文件中的任何其他内容。
  • 更新 TEMPLATES 设置 > 'DIRS': [os.path.join(BASE_DIR, 'templates')]

Overriding Admin Templates


实现此目的的另一种可能方法是重写 URL 以从 URL 中删除或替换 admin。简单地重写 URL 将导致 404。此外,必须额外添加用于服务管理静态文件的服务器配置。

你解决了错误的问题。防火墙有帮助您入门的标准规则,但必须进行自定义以匹配它们所保护的环境,而不是相反。

每次安装或升级时重命名文件和路径既费时又容易出错。对存在的路由进行例外处理 - 它们是有效路由,因此请向 WAF 介绍它们。

这样想:你永远不会post这样的问题:

“刚买了个防火墙,用什么应用框架可以放在后面,不用改框架?”