状态保持
一、cookie
cookie是存在浏览里面的,当浏览器携带cookie访问服务器的时候,服务端就会识别出是谁
查看cookie
现在新建一个视图来设置cookie
def set_cookie(request): #设置cookie response = HttpResponse('设置cookie') # response.set_cookie('name','chancey',expires=datetime.datetime(2019,1,15)) #指定日期过期 # response.set_cookie('name','chancey',max_age=20) #指定一段时间过期,20秒后 response.set_cookie('name','chancey') #不做任何设置的话默认关闭浏览器过期 return response
二、session
session的原理
session是存储在服务器里面,服务端会有类似于字典的存储空间,键值为sessionid和userinfo
当浏览器访问的时候,服务器给其sessionid,然后浏览器将sessionid保存在cookie里面,再次访问的时候就能识别出来
写个视图
def index(request): username = request.session.get('username','未登录') print(username) return render(request,'status/index.html',context={'username':username}) class Login(View): def get(self,request): return render(request,'status/login.html') def post(self,request): username = request.POST.get('username') print(username) request.session['username'] = username #设置session,其实就是给字典传值 return redirect(reverse('index'))
url
path('index/',views.index,name='index'), path('login/',views.Login.as_view(),name='login'),
<html> <head> <title>主页</title> </head> <body> 欢迎你,{{ username }}!! </body> </html>
<html> <head> <title>登录</title> </head> <body> <form action="" method="post"> {% csrf_token %} <p><input type="text" name="username"/></p> <p><input type="submit" value="登录"/></p> </form> </body> </html>
查看效果
这里回到数据库看一眼
session时长
法一、在视图中设置
- set_expiry(value):设置会话的超时时间
- 如果没有指定,则两个星期后过期
- 如果value是一个整数,会话将在values秒没有活动后过期
- 若果value是一个imedelta对象,会话将在当前时间加上这个指定的日期/时间过期
- 如果value为0,那么用户会话的Cookie将在用户的浏览器关闭时过期
- 如果value为None,那么会话永不过期
法二、在settings中设置
三、注册例子
视图
class Reg(View): def get(self,request): return render(request,'status/reg.html') def post(self,request): username = request.POST.get('user') passwd = request.POST.get('passwd') passwd_again = request.POST.get('passwd_again') if passwd == passwd_again: User.objects.create(user=username,passwd=passwd) return redirect(reverse('login')) else: return HttpResponse('密码不一致,重新注册')
模型
class User(models.Model): user = models.CharField(max_length=30,unique=True) passwd = models.CharField(max_length=100) def __str__(self): return 'User<user=%s,passwd=%s>'%(self.user,self.passwd)
url
path('reg/',views.Reg.as_view(),name='reg'),
四、登录的例子
视图
class Login(View): def get(self,request): return render(request,'status/login.html') def post(self,request): username = request.POST.get('username') passwd = request.POST.get('passwd') users = User.objects.filter(user=username) if users: if users.first().user == username and users.first().passwd == passwd: return redirect(reverse('index')) else: return HttpResponse('密码不正确') else: return HttpResponse('该用户不存在')
url
path('login/',views.Login.as_view(),name='login'),
效果