Django 如何禁止用户访问urls.py中未定义的URL
严格路由拦截实现方案
当前能直接访问media下的图片文件,核心原因是Django开发服务器在启动时,会在DEBUG模式下自动隐式挂载/media/、/static/路径的静态文件服务,这部分路由没有出现在你手动编写的urls.py配置里,属于框架内置的隐式规则,因此绕过了你自定义的路由校验逻辑。
操作步骤
1. 关闭开发服务器的隐式静态文件自动服务
- 临时测试严格路由规则时,不需要调整DEBUG配置,直接在启动服务的命令中加
--nostatic参数即可:
该参数的作用是禁止开发服务器自动处理static、media路径的请求,所有请求全部走你手动定义的urls.py规则匹配。python manage.py runserver --nostatic - 生产环境部署时,本身就要求将
settings.DEBUG设为False,此时开发服务器的隐式静态服务会自动失效,不需要额外加参数。
2. 在urls.py中配置全局兜底拦截规则
将你已有的所有自定义路由全部列在urlpatterns列表的靠前位置,在列表最后追加全局兜底规则,所有未命中前面显式配置的路径,全部直接返回404:
from django.http import HttpResponseNotFound from django.urls import re_path urlpatterns = [ # 已配置的业务路由(原规则保持不变) path('', views.index, name="AnimeHome"), path('about/', views.about, name="About"), path('watch/<int:animeId>', views.product, name="Watch"), path('search/', views.search, name="Search"), path('help/', views.help, name="Help"), path('feedback/', views.feedback, name="Feedback"), path('episode/<int:animeId>/<int:episodeNumber>',views.episode, name="Episode"), # 全局兜底规则:必须放在所有路由的最后,否则会拦截正常业务请求 re_path(r'^.*$', lambda request: HttpResponseNotFound('资源不存在')), ]
注意事项
- 兜底规则的位置绝对不能放在路由列表开头,否则会拦截所有正常的业务请求。
- 如果后续需要开放部分静态、媒体资源的访问权限,必须在urls.py中显式添加对应的路由配置,不能依赖Django内置的隐式静态服务逻辑。
- 生产环境部署时,需要在Nginx等前置Web服务器的配置中同步做好路径拦截,只允许转发经过明确配置的路由请求,未匹配的路径直接返回404,不要将请求直接转发到Django服务。
内容的提问来源于stack exchange,提问作者satish.patra
相关产品推荐
相关产品推荐

