You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何让Django视图仅响应HTMX发起的GET请求?

解决方法:校验HTMX专属请求头

HTMX发起请求时会自动携带HX-Request: true的HTTP请求头,你可以在Django视图中检查这个头是否存在,以此判断请求是否来自HTMX按钮点击,而非直接访问URL。

具体实现步骤

1. 在视图中添加请求头校验

修改处理筛选结果的视图函数,加入对HX-Request头的检查逻辑:

from django.http import HttpResponseForbidden

def filtered_results_view(request):
    # 验证是否为HTMX发起的请求
    if not request.headers.get('HX-Request'):
        # 非HTMX请求返回403禁止访问
        return HttpResponseForbidden("仅允许通过HTMX按钮访问此内容")
    
    # 原有筛选逻辑(比如数据库查询、数据处理)
    # results = YourModel.objects.filter(...)
    
    # 返回HTMX需要的页面片段
    return render(request, 'filtered_results.html', {'results': results})

2. 可选:重定向或返回提示页面

如果不想返回403状态码,也可以重定向到首页,或者返回一个友好提示页面:

from django.shortcuts import redirect

def filtered_results_view(request):
    if not request.headers.get('HX-Request'):
        # 重定向到首页,替换为你的首页URL名称
        return redirect('home')
    
    # 原有筛选逻辑...

3. 进阶:增强校验(可选)

HTMX还会附带其他请求头,比如HX-Current-URL(发起请求的页面URL),你可以进一步校验请求来源,提升安全性:

def filtered_results_view(request):
    hx_request = request.headers.get('HX-Request')
    # 严格校验请求头值和来源页面
    if not hx_request or hx_request != 'true':
        return HttpResponseForbidden()
    
    current_url = request.headers.get('HX-Current-URL')
    if not current_url or 'your_target_page' not in current_url:
        return HttpResponseForbidden()
    
    # 原有筛选逻辑...

原理说明

用户点击HTMX按钮时,HTMX会在AJAX请求中自动注入HX-Request: true头;而直接在地址栏输入URL访问时,浏览器不会携带这个头,因此视图可以精准拦截这类非法访问。

内容的提问来源于stack exchange,提问作者DjAndGo

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 17:40:58