1.cookie的简单介绍
- 定义
- 保存在浏览器本地上一组组键值对
- 不是python中都独有的
- 由服务器让浏览器进行设置的
- 浏览器把cookie保存在在浏览器本地
- 下次重新访问时自动携带该cookie信息
- 特点:
- 缺点: .缺少安全性
- 应用:
- 登录验证
- 保存浏览器设置习惯
- 存储简单的信息
演示案例
第一步:
完成路由及相关视图的设置
urls.py
url(r'^index/', views.index),
url(r'^login/', views.login),
nmsl----views.py
def index(request):
pass
def login(request):
pass
第二步:
加入前端页面
templates中新建login.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>login</title>
</head>
<body>
<form action="/login/" method="post">
<p>用户名:<input type="text" name="username"/></p >
<p>密码 #不能过于简单:<input type="password" name="passwd"/></p >
<p><input type="submit" value="登录"></p >
</form>
</div>
</body>
</html>
templates中新建index.html
<!DOCTYPE html>
<html lang="nmsl">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
{{ username }} #用户名
</body>
</html>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
{{ username }}
</body>
</html>
第三步:
views视图相关设置
nmsl-----views.py
def login(request):
print("cookie:", request.COOKIES)
print(request.POST)
if request.method == "POST": #如果请求,方法如下俩行
name = request.POST.get("username")
pwd = request.POST.get("passwd")
if name == "abc" and pwd == "123": #如果名字等于则返回请求
return redirect("/index/")
return render(request, 'login.html')
def index(request):
username = "abc"
return render(request, "index.html", locals())
def login(request):
print("cookie:", request.COOKIES)
print(request.POST)
if request.method == "POST":
name = request.POST.get("username")
pwd = request.POST.get("passwd")
if name == "abc" and pwd == "123":
return redirect("/index/")
return render(request, 'login.html')
def index(request):
username = "abc"
return render(request, "index.html", locals())
这些是我们之前完成的内容。现在当我们直接在URL中输入“/index”后,还是可以进入到登陆界面的,而这也就是为什么要有cookie这个技术的原因。
Django会自动帮我们写一个cookie,比如:
cookie: {'sessionid': 'gkd8n0irej5eyqrehyntevpdeayu074a', 'csrftoken': 'bZVRgqo6cADMZeOhIyLtzjuPeIqgyzO0mcJs1PQTZKBKGQjJoqZInDvtf7oZC7dh'}
其中'sessionid'我们不太熟悉,'csrftoken'则是Django为了防止跨域请求而需要处理的内容,可以看到,从cookie中,可以看到Django处理csrf时也用到了cookie,这里要有一个概念,cookie是一个技术,而我们可以利用这个技术完成不同场景下的需求。
第四步:
设置Cookie
nmsl----views.py
def login(request):
print("cookie:", request.COOKIES)
print(request.POST)
if request.method == "POST":
name = request.POST.get("username")
pwd = request.POST.get("passwd")
if name == "abc" and pwd == "123":
ret = redirect("/index/")
ret.set_cookie("username", name)
return ret
return render(request, 'login.html')
def index(request):
if request.COOKIES.get("username", None):
username = request.COOKIES.get("username", None)
return render(request, "index.html", locals())
else:
return render(request, "login.html", locals())
def login(request):
print("cookie:", request.COOKIES)
print(request.POST)
if request.method == "POST":
name = request.POST.get("username")
pwd = request.POST.get("passwd")
if name == "tangqiang" and pwd == "123":
ret = redirect("/index/")
ret.set_cookie("username", name)
return ret
return render(request, 'login.html')
def index(request):
if request.COOKIES.get("username", None):
username = request.COOKIES.get("username", None)
return render(request, "index.html", locals())
else:
return render(request, "login.html", locals())
设置cookie时可以设置它的有效时间:
ret.set_cookie("username", name, max_age=10)
Session
用cookie时有个问题,假如别人也能通过某种路径拿得到全部用户数据,那就存在安全隐患,
于是session出现了。我们可以 把关于用户的数据保存在服务端,在客户端cookie里加一个sessionID(随机字符串)来确认你是否在以前访问过。
流程:
(1)、当用户来访问服务端时,服务端会生成一个随机字符串;
(2)、当用户登录成功后 把 {sessionID :随机字符串} 组织成键值对加到cookie里发送给用户;
(3)、服务器以发送给客户端 cookie中的随机字符串做键,用户信息做值,保存用户信息;
(4)、再访问服务时客户端会带上sessionid,服务器根据sessionid来确认用户是否访问过网站
案例演示
第一步:
打印session信息
nmsl----views.py
在login函数中加入session内容的显示
print("session:", request.session)

当写入的时候没有相关提示,说明项目有问题,需要完成一些配置上的修改。进入setting.py配置文件中,将设置中间部分的内容修改为下面样子:

这是因为版本带来的问题,我们知道原因就可以了。
第二步:
因为使用session需要用到表,所有需要建立相关文件。
python manage.py migrate
第三步:
修改views中的内容
nmsl----views.py
def login(request):
print("cookie:", request.COOKIES)
print("session:", request.session)
print(request.POST)
if request.method == "POST":
name = request.POST.get("username")
pwd = request.POST.get("passwd")
if name == "abc" and pwd == "123":
request.session["is_login"] = True
request.session["username"] = name
return redirect("/index/")
return render(request, 'login.html')
def index(request):
if request.session.get("is_login", None):
print(request.session.get("username"))
username = request.session.get("username")
return render(request, "index.html", locals())
else:
return render(request, "login.html", locals())
def login(request):
print("cookie:", request.COOKIES)
print("session:", request.session)
print(request.POST)
if request.method == "POST":
name = request.POST.get("username")
pwd = request.POST.get("passwd")
if name == "tangqiang" and pwd == "123":
request.session["is_login"] = True
request.session["username"] = name
return redirect("/index/")
return render(request, 'login.html')
def index(request):
if request.session.get("is_login", None):
print(request.session.get("username"))
username = request.session.get("username")
return render(request, "index.html", locals())
else:
return render(request, "login.html", locals())
session默认在服务端保存15天。
获取session:request.session[key]
设置session:reqeust.session[key] = value
删除session:del request.session[key]

浙公网安备 33010602011771号