如何配置Django视图与URL以处理二级资源链接及任意引荐请求?
正确配置方案
1. 兜底URL的正确写法
必须把兜底URL放在所有具体URL的最后,因为Django是按顺序匹配URL的,前面的规则优先级更高。如果用path的path转换器没生效,可以改用re_path(原url函数)配合正则表达式,能覆盖所有未匹配的请求:
from django.urls import path, re_path from . import views urlpatterns = [ path('home/', views.home), # 兜底规则,放在最后 re_path(r'^(?P<referral>.*)$', views.any_referral), ]
这里的正则^(?P<referral>.*)$会匹配所有未被前面规则命中的请求,包括带斜杠、不带斜杠的各种路径。
2. 视图实现逻辑
视图需要接收referral参数,同时可以通过request.META.get('HTTP_REFERER')获取请求的引荐来源页面,以此实现资源引荐的处理逻辑:
from django.shortcuts import HttpResponse def any_referral(request, referral): # 获取引荐来源(即发起请求的页面地址) referer = request.META.get('HTTP_REFERER', '') # 这里添加你的业务逻辑,比如日志记录、返回指定资源等 # 示例:返回请求路径和引荐来源信息 return HttpResponse(f"请求路径: {referral}, 引荐来源: {referer}")
3. 静态资源请求的特殊处理
注意:Django默认会通过django.contrib.staticfiles中间件处理/static/开头的请求(比如你模板里的{% static 'images/favicon-32x32.png' %}),这类请求不会进入你的兜底视图。
如果需要接管静态资源的引荐请求,可按以下方式调整:
- 要么移除
INSTALLED_APPS中的django.contrib.staticfiles - 要么给静态资源单独配置路由,指向你的自定义视图:
urlpatterns = [ path('home/', views.home), # 先接管静态资源路径 re_path(r'^static/(?P<referral>.*)$', views.any_referral), # 再兜底其他所有路径 re_path(r'^(?P<referral>.*)$', views.any_referral), ]
4. 原配置失效的排查点
你之前用path('<path:referral>', any_referral)没触发,大概率是这几个原因:
- 该规则没放在所有URL的最后,被前面的规则拦截了
- 请求路径是根路径
/,而path('<path:referral>')要求referral非空,无法匹配根路径;若要覆盖根路径,需额外添加path('', views.any_referral) - 静态资源请求被Django的静态文件中间件接管,没进入自定义视图
内容的提问来源于stack exchange,提问作者Dimon Agon
相关产品推荐
相关产品推荐

