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
相关产品推荐
相关产品推荐

