Cookie 是存储在客户端计算机上的文本文件,并保留了各种跟踪信息。
识别返回用户包括三个步骤:
HTTP 是一种"无状态"协议,这意味着每次客户端检索网页时,客户端打开一个单独的连接到 Web 服务器,服务器会自动不保留之前客户端请求的任何记录。
但是仍然有以下三种方式来维持 Web 客户端和 Web 服务器之间的 session 会话:
一个 Web 服务器可以分配一个唯一的 session 会话 ID 作为每个 Web 客户端的 cookie,对于客户端的后续请求可以使用接收到的 cookie 来识别。
在Web开发中,使用 session 来完成会话跟踪,session 底层依赖 Cookie 技术。
设置 cookie:
rep.set_cookie(key,value,...)
rep.set_signed_cookie(key,value,salt='加密盐',...)
获取 cookie:
request.COOKIES.get(key)
删除 cookie:
rep =HttpResponse || render || redirect
rep.delete_cookie(key)
**class** UserInfo(models.Model):
username = models.CharField(max_length=32)
password = models.CharField(max_length=64)
**from** django.contrib **import** admin
**from** django.urls **import** path
**from** cookie **import** views
urlpatterns = [
path('admin/', admin.site.urls),
path('login/', views.login),
path('index/', views.index),
path('logout/', views.logout),
path('order/', views.logout)
**def** login(request):
**if** request.method == "GET":
**return** render(request, "login.html")
username = request.POST.get("username")
password = request.POST.get("pwd")
user_obj = models.UserInfo.objects.filter(username=username, password=password).first()
**print**(user_obj.username)
**if** **not** user_obj:
**return** redirect("/login/")
**else**:
rep = redirect("/index/")
rep.set_cookie("is_login", True)
**return** rep
**def** index(request):
**print**(request.COOKIES.get('is_login'))
status = request.COOKIES.get('is_login') # 收到浏览器的再次请求,判断浏览器携带的cookie是不是登录成功的时候响应的 cookie
**if** **not** status:
**return** redirect('/login/')
**return** render(request, "index.html")
**def** logout(request):
rep = redirect('/login/')
rep.delete_cookie("is_login")
**return** rep # 点击注销后执行,删除cookie,不再保存用户状态,并弹到登录页面
**def** order(request):
**print**(request.COOKIES.get('is_login'))
status = request.COOKIES.get('is_login')
**if** **not** status:
**return** redirect('/login/')
**return** render(request, "order.html")
以下创建三个模板文件:login.html、index.html、order.html。
<!DOCTYPE html> <html lang="en"> <head>
<meta charset="UTF-8">
<title>Title</title> </head> <body>
<h3>用户登录</h3> <form action="" method="post">
{
% csrf_token %}
<p>用户名:
<input type="text" name="username"></p>
<p>密码: <input type="password" name="pwd"></p>
<input type="submit"> </form>
</body> </html>
<html lang="en"> <head>
<meta charset="UTF-8">
<title>Titletitle> head> <body>
<h2>index 页面。。。h2>
<a href="/logout/">注销a>
body>
html>
<!DOCTYPE html> <html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<h2>order 页面。。。</h2>
<a href="/logout/">注销</a>
</body>
</html>
运行结果如下图所示:
服务器在运行时可以为每一个用户的浏览器创建一个其独享的 session 对象,由于 session 为用户浏览器独享,所以用户在访问服务器的 web 资源时,可以把各自的数据放在各自的 session 中,当用户再去访问该服务器中的其它 web 资源时,其它 web 资源再从用户各自的 session 中取出数据为用户服务。
a. 浏览器第一次请求获取登录页面 login。
b. 浏览器输入账号密码第二次请求,若输入正确,服务器响应浏览器一个 index 页面和一个键为 sessionid,值为随机字符串的 cookie,即 set_cookie (“sessionid”,随机字符串)。
c. 服务器内部在 django.session 表中记录一条数据。
django.session 表中有三个字段。
d. 浏览器第三次请求其他资源时,携带 cookie :{sessionid:随机字符串},服务器从 django.session 表中根据该随机字符串取出该用户的数据,供其使用(即保存状态)。
注意: django.session 表中保存的是浏览器的信息,而不是每一个用户的信息。 因此, 同一浏览器多个用户请求只保存一条记录(后面覆盖前面),多个浏览器请求才保存多条记录。
cookie 弥补了 http 无状态的不足,让服务器知道来的人是"谁",但是 cookie 以文本的形式保存在浏览器端,安全性较差,且最大只支持 4096 字节,所以只通过 cookie 识别不同的用户,然后,在对应的 session 里保存私密的信息以及超过 4096 字节的文本。
session 设置:
request.session["key"] = value
执行步骤:
session 获取:
request.session.get('key')
执行步骤:
session 删除,删除整条记录(包括 session_key、session_data、expire_date 三个字段):
request.session.flush()
删除 session_data 里的其中一组键值对:
del request.session["key"]
执行步骤:
创建路由:
**from** session **import** views **as** session_views
urlpatterns = [
path('session_login/', session_views.login),
path('s_index/', session_views.s_index),
path('s_logout/', session_views.s_logout),
]
创建视图函数:
**def** login(request):
**if** request.method == "GET":
**return** render(request, "login.html")
username = request.POST.get("username")
password = request.POST.get("pwd")
user_obj = models.UserInfo.objects.filter(username=username, password=password).first()
**print**(user_obj.username)
**if** **not** user_obj:
**return** redirect("/session_login/")
**else**:
request.session['is_login'] = True
request.session['user1'] = username
**return** redirect("/s_index/")
**def** s_index(request):
status = request.session.get('is_login')
**if** **not** status:
**return** redirect('/session_login/')
**return** render(request, "s_index.html")
**def** s_logout(request):
\# del request.session["is_login"] # 删除session_data里的一组键值对
request.session.flush() # 删除一条记录包括(session_key session_data expire_date)三个字段
**return** redirect('/session_login/')
模板文件:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<h2>session_index 页面。。。{
{
request.session.user1 }}</h2>
<a href="/s_logout/">注销</a>
</body>
</html>
运行结果如下图所示: