Django中如何在视图函数间传递变量?
Django视图间用户信息传递解决方案
你的问题在于两个视图函数是独立处理HTTP请求的,signin里的uname是局部变量,仅在当前请求周期内有效,无法直接被reservations访问。下面是两种可行的解决方法,优先推荐使用Django官方认证系统:
方法一:使用Django自带认证系统(推荐)
这是处理用户登录的标准方式,安全且无需手动管理会话:
1. 完善signin视图,实现用户登录
from django.contrib.auth import authenticate, login from django.shortcuts import redirect, render from django.http import HttpResponse def signin(request): if request.method == 'POST': uname = request.POST['username'] pwd = request.POST['password'] # 验证用户名和密码是否匹配 user = authenticate(request, username=uname, password=pwd) if user is not None: # 登录用户,Django自动将用户信息存入session login(request, user) # 登录成功后跳转至预订页面 return redirect('reservations') else: return HttpResponse('用户名或密码错误') # GET请求返回登录页面 return render(request, 'signin.html')
2. 修改reservations视图,获取当前登录用户
from django.contrib.auth.decorators import login_required from django.shortcuts import render from django.http import HttpResponse from .models import Reserve # 装饰器确保只有登录用户能访问该视图 @login_required def reservations(request): try: # request.user即为当前登录的用户对象 reserve = Reserve.objects.get(client=request.user) return render(request, 'reservation.html', {'reserve': reserve}) except Reserve.DoesNotExist: # 精确捕获预订不存在的异常,避免隐藏其他错误 return HttpResponse('你没有预订记录!')
方法二:手动通过Session存储用户名(不推荐,仅特殊场景使用)
如果不想依赖Django认证系统,可以手动将用户名存入会话,但需自行处理安全验证:
1. 在signin中存储用户名到Session
from django.shortcuts import redirect, render from django.http import HttpResponse from .models import Utilisateur def signin(request): if request.method == 'POST': uname = request.POST['username'] pwd = request.POST['password'] # 先验证用户是否存在(注意:此处若密码是明文存储存在安全风险,建议用哈希) if Utilisateur.objects.filter(username=uname, password=pwd).exists(): # 将用户名存入session request.session['username'] = uname return redirect('reservations') else: return HttpResponse('用户名或密码错误') return render(request, 'signin.html')
2. 在reservations中从Session获取用户名
from django.shortcuts import redirect, render from django.http import HttpResponse from .models import Utilisateur, Reserve def reservations(request): # 从session读取用户名,不存在则跳转至登录页 uname = request.session.get('username') if not uname: return redirect('signin') try: c = Utilisateur.objects.get(username=uname) reserve = Reserve.objects.get(client=c) return render(request, 'reservation.html', {'reserve': reserve}) except (Utilisateur.DoesNotExist, Reserve.DoesNotExist): return HttpResponse('你没有预订记录!')
注意事项
- 避免使用裸
except:,始终捕获具体异常,防止隐藏代码中的其他错误 - 自行管理用户验证时,务必对密码进行哈希存储,禁止明文存储密码,否则会导致严重安全问题
内容的提问来源于stack exchange,提问作者user19069531
相关产品推荐
相关产品推荐

