1.cookie的简单介绍

  • 定义
    • 保存在浏览器本地上一组组键值对
    • 不是python中都独有的
      特点:
      1. 由服务器让浏览器进行设置的
      2. 浏览器把cookie保存在在浏览器本地
      3. 下次重新访问时自动携带该cookie信息
       缺点:  .缺少安全性
  • 应用:
    1. 登录验证
    2. 保存浏览器设置习惯
    3. 存储简单的信息

演示案例

第一步:

完成路由及相关视图的设置

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]