Django中通过年龄验证后如何重定向回原页面?
解决Django年龄验证后重定向回原页面的问题
你当前用HTTP_REFERER无法正确获取用户原本访问的页面,原因是当用户从主视图重定向到年龄验证页时,HTTP_REFERER会被覆盖为主视图的URL,而非用户最初请求的页面地址。以下是可靠的解决方案:
步骤1:主视图重定向时传递原页面URL参数
修改主视图的重定向逻辑,将用户当前请求的路径作为next参数传递给年龄验证页面:
def main_view(request): if request.session.has_key('agegate'): random_category = random.choice(Category.objects.all()) random_picture = random.choice(CoreImages.objects.all()) context = { 'image' : random_picture, 'category' : random_category, 'bottles': Bottle.objects.all(), } return render(request,'Academy/home.html', context) else: # 获取用户当前访问的路径,作为next参数传递 next_url = request.path return redirect(f'/preview/agegate?next={next_url}')
如果你的URL配置了名称,也可以用reverse更规范地生成跳转地址:
from django.urls import reverse # ... else: next_url = request.path agegate_url = f"{reverse('agegate')}?next={next_url}" return redirect(agegate_url)
步骤2:年龄验证视图获取并使用next参数
修改年龄验证视图,从GET参数中读取next值,验证通过后重定向到该地址(同时设置默认值,防止参数为空的情况):
def age_gate_view(request): # 从GET参数获取跳转目标,默认跳转到首页 next_url = request.GET.get('next', '/') form = AgeGateForm() if request.method == 'POST': form = AgeGateForm(request.POST) if form.is_valid(): form.save() request.session['agegate'] = 'welcome' return HttpResponseRedirect(next_url) context = { 'form': form, } return render(request,'Academy/agegate.html', context)
补充说明
HTTP_REFERER是浏览器提供的请求头,不可靠:部分浏览器可能不发送该头,或者在重定向过程中会被覆盖,因此不适合用来保存跳转目标。- 传递
next参数的方式更可控,能确保用户验证后回到最初请求的页面。
内容的提问来源于stack exchange,提问作者Thomas Doll-Datema
相关产品推荐
相关产品推荐

