zoukankan      html  css  js  c++  java
  • 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. 本机内存 + 数据库

  • 相关阅读:
    4、路由事件 RoutedEvent
    3、Grid、GridSplitter 网格分离器、SharedSizeGroup 共享尺寸组
    2、DockPanel
    1、布局容器Grid、StackPanel、GroupBox、DockPanel、WrapPanel
    15、Qt 样式表
    14、SpinBox与Horizontal Scroll Bar
    13、Qt界面布局
    12、label控件
    11、LineEdit与setCompleter自动补全
    Linux设备模型 (2)
  • 原文地址:https://www.cnblogs.com/meloncodezhang/p/11753986.html
Copyright © 2011-2022 走看看