You need to enable JavaScript to run this app. Django 如何禁止用户访问urls.py中未定义的URL
优惠活动
大模型
产品
解决方案
定价
更多

Django 如何禁止用户访问urls.py中未定义的URL

严格路由拦截实现方案

当前能直接访问media下的图片文件,核心原因是Django开发服务器在启动时,会在DEBUG模式下自动隐式挂载/media/、/static/路径的静态文件服务,这部分路由没有出现在你手动编写的urls.py配置里,属于框架内置的隐式规则,因此绕过了你自定义的路由校验逻辑。

操作步骤

1. 关闭开发服务器的隐式静态文件自动服务

  • 临时测试严格路由规则时,不需要调整DEBUG配置,直接在启动服务的命令中加--nostatic参数即可:
    python manage.py runserver --nostatic
    
    该参数的作用是禁止开发服务器自动处理static、media路径的请求,所有请求全部走你手动定义的urls.py规则匹配。
  • 生产环境部署时,本身就要求将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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.11.02 10:45:07