django之cookie和session

一:cookie

  cookie是一段存在本地浏览器上的文本信息,不适合存储敏感的密码等信息,不安全。

  cookie的特点:

    1. 键值对的形式

    2.Cookie基于域名安全,不同域名的Cookie是不能互相访问的,如访问www.taobao.com时向浏览器中写了Cookie信息,使用同一浏览器访问baidu.com时,无法访问到itcast.cn写的Cookie信息。

    3.当浏览器请求某网站时,会将浏览器存储的跟网站相关的所有Cookie信息提交给网站服务器。

二:设置cookie

def get_json_data(request):
    response = HttpResponse("ok")
   #name是cookie的键,value的值是name的值,max_age=300是cookie的有效期,单位为秒。 response.set_cookie(
"name",value="zhangsanfeng",max_age=300) # 设置cookie通过HttpResponse的实例对象进行设置 json_str = request.body json_str = json_str.decode("utf-8") data = json.loads(json_str) d = data["test"] print(d) return response

 三:获取cookie

def get_json_data(request):
    json_str = request.body
    json_str = json_str.decode("utf-8")
    data = json.loads(json_str)
    d = data["test"]
    print(d)
    cookie = request.COOKIES.get("name")  # 获取cookie的方式
    return HttpResponse("cookie:{}".format(cookie))

postman

 四:删除cookie

def get_json_data(request):
    response = HttpResponse("删除cookie")
    response.delete_cookie("name")
    return response

postman


结果:严格意义上不是完全删除cookie,只是删除了cookie中name的值。

五:cookie的原理

  因为Http的请求时无状态的,无法判断每次是谁请求的,因此需要一个东西用来判断是谁请求了我,那么这个东西就是cookie,浏览器每次请求会带上cookie,服务器通过cookie,就知道是张三请求了我,还是李四请求了我。

  cookie的大小上限为4kb,一个服务器最多在客户端上保存20个cookie,一个浏览器最多保存300个cookie。

  但是有一个问题,上面我们给服务器postman中设置了cookie,为什么cookie是明文显示,安全性太差。怎么保证我们传输的是加密的。

def get_json_data(request):
    response = HttpResponse("cookie加密")
  response.set_signed_cookie("name","zhangsanfeng",salt="key",max_age=3600)
    return response

postman

结果:value的值被签名了,只是被加了签名的cookie,并不是被加密后的值,能看出来zhangsanfenxxxxx 后面跟了一串,应该是签名的东西。
重要expires是cookie在浏览器中的存活时间。

 二:session

  session主要用于会话控制,Session 对象存储特定用户会话所需的属性及配置信息。这样,当用户在应用程序的 Web 页之间跳转时,存储在 Session 对象中的变量将不会丢失,而是在整个用户会话中一直存在下去。当用户请求来自应用程序的 Web 页时,如果该用户还没有会话,则 Web 服务器将自动创建一个 Session 对象。当会话过期或被删除后,服务器将终止该会话。

  session的功能就是将服务器需要保存的数据存储在服务端。例如账号登录记录的功能,可以以session的方式将登录状态保存在服务器端,这样当用户访问其他程序时,需要用到登录的地方,都可以从该用户的session中取出该用户的数据,为用户服务。

  session可以存储方式:

  1. 数据库

setting.py文件中:
Django默认支持Session,并且默认是将Session数据存储在数据库中,即:django_session 表中
session存贮redis数据库中  # 必须保证django中安装了django-redis,没有的话 pip install django-redis
1. 建立一个CACHES字典,指明数据库的信息
CACHES = {
    "default": {
        "BACKEND": "django_redis.cache.RedisCache",
        "LOCATION": "redis://127.0.0.1:6379/1",
        "OPTIONS": {
            "CLIENT_CLASS": "django_redis.client.DefaultClient",
        }
    }
}
2. 声明引擎 SESSION_ENGINE = "django.contrib.sessions.backends.cache"
3. 缓存别名的建立,采取默认值 SESSION_CACHE_ALIAS = "default"

 实例:访问主页设置session,然后访问其他页面,都要经过session验证,来保持会话

from django.http import HttpResponse
from django.http import JsonResponse


def index(request):
    request.session["user_id"] = 1 # 给session中设置键值对
    return HttpResponse("欢迎访问")


def goat_show(request):
    user_id = request.session.get("user_id",None) # 获取session中存储的值,默认是None
    if user_id:
        return JsonResponse({"1":"美多多","2":"喜多多","3":"懒多多"})
    else:
        return JsonResponse({"error":"请登录后访问"})

第一步:访问 127.0.0.1:8000/user/index

原因是:SESSION_CACHE_ALIAS = "default" 被我改成 "django_redis"导致,修改成default就可解决问题,具体原因,后面再研究。

第二步:访问 127.0.0.1:8000/user/goat_show

在goat中打印user_id 结果为 1

在数据库中存储的样式为 ":1:django.contrib.sessions.cacheufbtwh9nrbjtuvh6tq1v6mg4pwv0onls"

这种形式的存储:按理说不是应该对值 1进行加密么,怎么1暴露在外面了?

request.session.clear()  清除所有的session,只是将session中所有键值对的值部分删除了
request.session.flush()  清除session数据,在存储中删除session的整条数据。键值对都删除了
del request.session['键']  删除session中的指定键及值,在存储中只删除某个键及对应的值。
request.session.set_expiry(value)  设置session的有效期,不填,默认是两周的时间,默认是秒。

  2. 本机内存

  3. 本机内存 + 数据库

原文地址:https://www.cnblogs.com/meloncodezhang/p/11753986.html