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

Django如何检查当前访问路径是否包含指定uid以解决判断失效问题

问题原因

  • 你当前的逻辑用==完全匹配路径和uid,但是request.path是完整的请求路径,包含路径前缀、结尾斜杠等内容,不可能和单独的uid字符串完全相等,这是判断始终返回false的核心原因
  • 你在视图函数开头直接把路由传递过来的token参数覆盖成了packet.uid,相当于完全丢弃了路由里匹配到的路径参数,逻辑冗余且不符合需求

修正方案

有两种可选实现方式,按需选择即可:

方式1:直接比对路由传递的token和数据库存储的uid(推荐,性能更高不需要操作路径字符串)

路由规则本来就已经把uid部分提取为token参数传到视图里了,直接比对这个参数和数据库存的uid即可,代码修改如下:

@login_required(login_url='home:login')
def ChangeEmailView(request, token):
    packet = get_object_or_404(TempUrl, user=request.user)
    # 直接比对路由传递的token和数据库存储的uid
    if token == str(packet.uid):
        if request.method == 'POST':
            objects = User.objects.get(email = request.user.email)
            form = EmailChangingForm(request.POST, instance=objects)
            if form.is_valid():
                form.save()
            return redirect('home:profilesettings')
        else:
            objects = User.objects.get(email = request.user.email)
            form = EmailChangingForm(instance=objects) # GET请求不需要传request.POST
            token = packet.uid
    else:  
        print('site wasnt found')
        return redirect('home:index')
    context = {'form': form, 'token': token}
    return render(request, 'home/email_settings.html', context)

额外优化点:GET请求实例化表单的时候不需要传request.POST,避免无意义的表单校验报错。

方式2:判断路径是否包含uid(符合你最初的需求)

如果确实需要校验完整路径是否包含uid,把==改成in判断即可:

# 把原来的if request.path == str(token): 改成
if str(packet.uid) in request.path:

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 15:57:04