首页 > 技术文章 > 状态保持

chancey 2019-01-15 17:04 原文

一、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>
index.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>
login.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'),

效果

推荐阅读