如何在 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')]
实现此目的的另一种可能方法是重写 URL 以从 URL 中删除或替换 admin。简单地重写 URL 将导致 404。此外,必须额外添加用于服务管理静态文件的服务器配置。
你解决了错误的问题。防火墙有帮助您入门的标准规则,但必须进行自定义以匹配它们所保护的环境,而不是相反。
每次安装或升级时重命名文件和路径既费时又容易出错。对存在的路由进行例外处理 - 它们是有效路由,因此请向 WAF 介绍它们。
这样想:你永远不会post这样的问题:
“刚买了个防火墙,用什么应用框架可以放在后面,不用改框架?”
加载 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')]
实现此目的的另一种可能方法是重写 URL 以从 URL 中删除或替换 admin。简单地重写 URL 将导致 404。此外,必须额外添加用于服务管理静态文件的服务器配置。
你解决了错误的问题。防火墙有帮助您入门的标准规则,但必须进行自定义以匹配它们所保护的环境,而不是相反。
每次安装或升级时重命名文件和路径既费时又容易出错。对存在的路由进行例外处理 - 它们是有效路由,因此请向 WAF 介绍它们。
这样想:你永远不会post这样的问题:
“刚买了个防火墙,用什么应用框架可以放在后面,不用改框架?”