pyhton框架Django之cookie和session

Posted lanyinhao

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了pyhton框架Django之cookie和session相关的知识,希望对你有一定的参考价值。

一,cookie和session的理解

cookies 是浏览器为 Web 服务器存储的一小段信息。 每次浏览器从某个服务器请求页面时,它向服务器回送之前收到的cookies。它保存在浏览器下的某个文件夹下。保存在浏览器端的键值对可以利用做登录

浏览器下的cookei:

技术分享图片

Session  

  Django的Session机制会向请求的浏览器发送cookie字符串。同时也会保存到本地一份,用来验证浏览器登录是否为同一用户。它存在于服务器,Django默认会把session存入到数据库中。

  Session依赖于Cookie,如果浏览器不能保存cooki那么session就失效了。因为它需要浏览器的cooki值去session里做对比。session就是用来在服务器端保存用户的会话状态。

区别:

1、cookie数据存放在客户的浏览器上,session数据放在服务器上。

2、cookie不是很安全,别人可以分析存放在本地的COOKIE并进行COOKIE欺骗
考虑到安全应当使用session。

3、session会在一定时间内保存在服务器上。当访问增多,会比较占用你服务器的性能
考虑到减轻服务器性能方面,应当使用COOKIE。

4、单个cookie保存的数据不能超过4K,很多浏览器都限制一个站点最多保存20个cookie。

二,cookei

技术分享图片

  当你浏览京东或者天猫的时候,登录成功以后(一次请求),想查看我的订单(另一次请求),但是http是短连接(连接一次就断开),服务器该如何判断你是否登录呢?所以在服务器端需要有一个保存用户状态地方(session),客户端登录成功后,服务端向客户端浏览器写入一段字符串(标识),客户端每次访问的时候需要带上这个标识,服务端根据这个标识就能获取客户端信息了。客户端保存这个标识就叫做cookie。

构成:

1、自动生成一段字符串

2、将字符串发送到客户端的浏览器(cookie),同时把这段字符串当做key放在session里。(可以理解为session就是一个字典)

3、在用户的session对应的value里设置任意值(字典里面可以继续套字典)

cookie的简单使用

1、获取Cookie

request.COOKIES.get("islogin",None) #如果有就获取,没有就默认为none

2、设置Cookie

  obj = redirect("/index/")
  obj.set_cookie("islogin",True)  #设置cookie值,注意这里的参数,一个是键,一个是值
  obj.set_cookie("haiyan","344",20)  #20代表过期时间
  obj.set_cookie("username", username)

3、删除Cookie

obj.delete_cookie("cookie_key",path="/",domain=name)

 登录认证示例:

需要知道几点

一共有三次请求
  注意:form表单的action走的路径还是/login/
     第一次请求:url:http://127.0.0.1:8080/login get请求
       第一次请求:url:http://127.0.0.1:8080/login post请求 user pasw
       第一次请求:url:http://127.0.0.1:8080/index post请求 携带着cookie的了
       所以在index页面中就会取到cookie,因为这是的index里面已经有cookie了

技术分享图片

技术分享图片
from app01 import views
urlpatterns = [
    url(r^admin/, admin.site.urls),
    url(r^login/, views.login),
    url(r^index/, views.index),
]
urls.py
技术分享图片
from django.shortcuts import render,redirect,HttpResponse
from app01 import models
# Create your views here.
def login(request):
    if request.method=="POST":
        print("所有请求数据",request.POST)
        username = request.POST.get("username")
        password = request.POST.get("password")
        # 查看数据库中的用户名和密码,对比用户输入的是否是数据库中的值
        ret = models.UserInfo.objects.filter(username=username,password=password)
        if ret:  #如果用户名和密码都正确,则登录成功
            print(request.COOKIES)  #{‘csrftoken‘: ‘1EaTcdQlxdwtR0eXu4uDqEHElEpOlDRJoSAd7TfA7cBDxAyxADVPbIKaZk6J0DVB‘}
            # 由于http协议是无状态的,你这次登录完就不知道是谁登录了,当别人知道你的主页url,就都可以登录了。那样就没有隐私了
            # 这就得用到cookie了
            obj = redirect("/index/")
            obj.set_cookie("islogin",True)  #设置cookie值,注意这里的参数,一个是键,一个是值
            obj.set_cookie("haiyan","344",20)  #20代表过期时间
            obj.set_cookie("username", username)
            return obj
        else:
            return render(request,"login.html")
    else:
        return render(request,"login.html")
def index(request):
    is_login = request.COOKIES.get("islogin",None)  #得到cookie,有就得到,没有就得到none
    if is_login:
        username = request.COOKIES.get("username")
        print(username)
        return render(request,"index.html",{"username":username})
    else:  #如果没有拿到值,就一直在登录页面就进不去
        return redirect("/login/")
views.py
技术分享图片
class UserInfo(models.Model):
    username =models.CharField(max_length=32)
    password =models.CharField(max_length=32)
models.py
技术分享图片
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width">
    <title>用户登录</title>
    <link rel="stylesheet" href="/static/bootstrap-3.3.7-dist/css/bootstrap.min.css">
    <script src="/static/bootstrap-3.3.7-dist/js/bootstrap.min.js"></script>
    <style>
        .c1{
            margin-top: 100px;
        }
        .btn{
            width: 130px;
        }
        .c2{
            margin-left: 40px;
        }
    </style>
</head>
<body>
<div class="container">
    <div class="row">
        <div class="c1 col-md-5 col-md-offset-3">
            <form class="form-horizontal" action="/login/" method="post" novalidate>
                {% csrf_token %}
                <div class="form-group">
                    <label for="username" class="col-sm-2 control-label">用户名</label>
                    <div class="col-sm-10">
                        <input type="email" class="form-control" id="username" placeholder="Email" name="username">
                    </div>
                </div>
                <div class="form-group">
                    <label for="password" class="col-sm-2 control-label">密码</label>
                    <div class="col-sm-10">
                        <input type="password" class="form-control" name="password" id="password"
                               placeholder="Password">
                    </div>
                </div>
                <div class="form-group">
                    <div class="col-sm-offset-2 col-sm-10">
                        <button type="submit" class="btn btn-primary">登录</button>
                        <button type="submit" class="btn btn-success c2">注册</button>
                    </div>
                </div>
            </form>
        </div>
    </div>
</div>
 
</body>
</html>
login.html
技术分享图片
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width">
    <title>Title</title>
</head>
<body>
<h1>hello{{ username }}</h1>
</body>
</html>
index.html
技术分享图片
def login(request):
    pass
    message = ""
    v = request.session
    print(type(v))
    #from django.contrib.sessions.backends.db import SessionStore
    if request.method == "POST":
        user = request.POST.get(‘user‘)
        pwd = request.POST.get(‘pwd‘)

        c = models.Administrator.objects.filter(username=user, password=pwd).count()
        if c:
            request.session[‘is_login‘] = True
            request.session[‘username‘] = user
            rep = redirect(‘/index.html‘)
            return rep
        else:
            message = "用户名或密码错误"
    obj = render(request,‘login.html‘, {‘msg‘: message})
    return obj

/*************装饰器auth************/
def auth(func):
    def inner(request, *args, **kwargs):
        is_login = request.session.get(‘is_login‘)
        if is_login:
            return func(request, *args, **kwargs)
        else:
            return redirect(‘/login.html‘)
    return inner

@auth
def index(request):
    current_user = request.session.get(‘username‘)
    return render(request, ‘index.html‘,{‘username‘: current_user})
利用装饰器写的登录的view.py

三,session

Django中操作session:

  获取session:request.session[key]     request.session.get(key)

  设置session:reqeust.session[key] = value

  删除session:del request[key]   request.session.clear()

一段简单的Django中实现session的代码,判断用户是否已经成功登录:

技术分享图片
def login(request):
    if request.method ==POST:
        username = request.POST.get(username)
        pwd = request.POST.get(pwd)
        if username ==lisi and pwd == 12345:
            request.session[IS_LOGIN] = True       设置session
            return redirect(/app01/home/)

    return render(request,login.html)

def home(request):
    is_login = request.session.get(IS_LOGIN,False)   获取session里的值
    if is_login:
        return HttpResponse(order)
    else:
        return redirect(/app01/login/)
View Code

session配置文件:   

数据库配置

#settings.py配置文件

SESSION_ENGINE = django.contrib.sessions.backends.file  # 引擎
SESSION_FILE_PATH = 文件路径  # 缓存文件路径,如果为None,则使用tempfile模块获取一个临时地址tempfile.gettempdir()                                                            # 如:/var/folders/d3/j9tj0gz93dg06bmwxmhh6_xm0000gn/T
session不仅可以保存在数据库里,
数据库(默认)
缓存(memchache、redis)
文件
缓存+数据库
加密cookie

SESSION_COOKIE_NAME="zhanggen"  # Session的cookie保存在浏览器上时的key,即:sessionid=随机字符串
SESSION_COOKIE_PATH="/"  # Session的cookie保存的路径
SESSION_COOKIE_DOMAIN = None  # Session的cookie保存的域名
SESSION_COOKIE_SECURE = False  # 是否Https传输cookie
SESSION_COOKIE_HTTPONLY = True  # 是否Session的cookie只支持http传输
SESSION_COOKIE_AGE = 600000  # Session的cookie失效日期(2周) 默认1209600秒
SESSION_EXPIRE_AT_BROWSER_CLOSE =True  # 是否关闭浏览器使得Session过期

SESSION_SAVE_EVERY_REQUEST = True  
#如果你设置了session的过期时间 30分钟后,这个参数是False30分钟过后,session准时失效
#如果设置 True,在30分钟期间有请求服务端,就不会过期!(为什么逛一晚上淘宝,也不会登出,但是不浏览器不刷新了就会自动登出)

 session保存位置配置

缓存 redis memcache
SESSION_ENGINE = django.contrib.sessions.backends.cached_db        # 引擎


浏览器cook(相当于没有用session,又把敏感信息保存到客户端了)
 SESSION_ENGINE = django.contrib.sessions.backends.signed_cookies   # 引擎

缓存配置

 

#配置 settings.py
   
    SESSION_ENGINE = django.contrib.sessions.backends.cache  # 引擎
    SESSION_CACHE_ALIAS = default                            # 使用的缓存别名(默认内存缓存,也可以是memcache),此处别名依赖缓存的设置
   
    SESSION_COOKIE_NAME = "sessionid"                        # Session的cookie保存在浏览器上时的key,即:sessionid=随机字符串
    SESSION_COOKIE_PATH = "/"                                # Session的cookie保存的路径
    SESSION_COOKIE_DOMAIN = None                              # Session的cookie保存的域名
    SESSION_COOKIE_SECURE = False                             # 是否Https传输cookie
    SESSION_COOKIE_HTTPONLY = True                            # 是否Session的cookie只支持http传输
    SESSION_COOKIE_AGE = 1209600                              # Session的cookie失效日期(2周)
    SESSION_EXPIRE_AT_BROWSER_CLOSE = False                   # 是否关闭浏览器使得Session过期
    SESSION_SAVE_EVERY_REQUEST = False                        # 是否每次请求都保存Session,默认修改之后才保存

 

文件配置

 

#配置 settings.py
   
    SESSION_ENGINE = django.contrib.sessions.backends.file    # 引擎
    SESSION_FILE_PATH = None                                    # 缓存文件路径,如果为None,则使用tempfile模块获取一个临时地址tempfile.gettempdir()       
    SESSION_COOKIE_NAME = "sessionid"                          # Session的cookie保存在浏览器上时的key,即:sessionid=随机字符串
    SESSION_COOKIE_PATH = "/"                                  # Session的cookie保存的路径
    SESSION_COOKIE_DOMAIN = None                                # Session的cookie保存的域名
    SESSION_COOKIE_SECURE = False                               # 是否Https传输cookie
    SESSION_COOKIE_HTTPONLY = True                              # 是否Session的cookie只支持http传输
    SESSION_COOKIE_AGE = 1209600                                # Session的cookie失效日期(2周)
    SESSION_EXPIRE_AT_BROWSER_CLOSE = False                     # 是否关闭浏览器使得Session过期
    SESSION_SAVE_EVERY_REQUEST = False                          # 是否每次请求都保存Session,默认修改之后才保存

 

博客链接:http://www.cnblogs.com/yuanchenqi/articles/7439088.html#3770465

 

 

#Django默认支持Session,并且默认是将Session数据存储在数据库中,即:django_session 表中。
   
#配置 settings.py
   
    SESSION_ENGINE = ‘django.contrib.sessions.backends.db‘   # 引擎(默认)
       
    SESSION_COOKIE_NAME = "sessionid"                       # Session的cookie保存在浏览器上时的key,即:sessionid=随机字符串(默认)
    SESSION_COOKIE_PATH = "/"                               # Session的cookie保存的路径(默认)
    SESSION_COOKIE_DOMAIN = None                             # Session的cookie保存的域名(默认)
    SESSION_COOKIE_SECURE = False                            # 是否Https传输cookie(默认)
    SESSION_COOKIE_HTTPONLY = True                           # 是否Session的cookie只支持http传输(默认)
    SESSION_COOKIE_AGE = 1209600                             # Session的cookie失效日期(2周)(默认)
    SESSION_EXPIRE_AT_BROWSER_CLOSE = False                  # 是否关闭浏览器使得Session过期(默认)
    SESSION_SAVE_EVERY_REQUEST = False                       # 是否每次请求都保存Session,默认修改之后才保存(默认)








以上是关于pyhton框架Django之cookie和session的主要内容,如果未能解决你的问题,请参考以下文章

Web框架之Django_08 重要组件(form组件cookie和session组件)

Django框架 之 CookieSession整理补充

Pyhton全栈的知识点

Flask 简单使用

Django框架目录索引

8Django实战第8天:session和cookie自动登录机制