• Django进阶之session


    关于COOKIE和SESSION,参考 http://www.cnblogs.com/zhaof/p/7211253.html

    基于cookie做用户验证时:敏感信息不适合放在cookie中

    session依赖cookie

    session原理

    cookie是保存在用户浏览器端的键值对

    session是保存在服务器端的键值对

    session在服务端中存在的数据格式为:

    session = {
       随机字符串1:{
       用户1的相关信息
        }
       随机字符串2:{
       用户2的相关信息
        }
    }

    session客户端即客户端的浏览器的cookie中存的数据是当前用户对应的随机字符串

    样例:基于session实现用户登录认证

    views.py内容如下:

    from django.shortcuts import render,redirect
    
    user_info = {
        'jack':{'pwd':'jack123'},
        'tom':{'pwd':'tom123'},
    }
    def login(request):
        # print(request.method)
        if request.method=="GET":
            return render(request,"login.html")
        if request.method =="POST":
    
            u = request.POST.get("username")
            p = request.POST.get("pwd")
            dic = user_info.get(u)
            # print(u,p)
            if not dic:
                return render(request,"login.html")
            if dic["pwd"] == p:
                # 1.生成随机字符串
                # 2.写到用户浏览器cookie
                # 3.保存到session中
                # 4.在随机字符串对应的字典中设置相关内容
                # session中设置值
                request.session['username'] = u
                request.session['is_login'] = True
                return redirect("/cmdb/index/")
            else:
                return render(request, "login.html")
    
    def index(request):
        # 1.获取当前用户的随机字符串
        # 2.根据随机字符串获取对应信息
        # session中获取值
        if request.session.get('is_login'):
            return render(request,"index.html")
        else:
            return render (request,"login.html")
    
    def logout(request):
        request.session.clear()
        return redirect('/cmdb/login/')

    login.html内容如下:

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
    </head>
    <body>
        <form action="/cmdb/login/" method="POST">
            <input type="text" name="username" placeholder="用户名">
            <input type="password" name="pwd" placeholder="密码">
            <input type="submit" value="提交">
        </form>
    </body>
    </html>

    index.html内容如下:

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
    </head>
    <body>
        <h1>欢迎登陆 {{ request.session.username }}</h1>
        <a href="/cmdb/logout/">注销</a>
    </body>
    </html>

    session的工作过程

    1、    生成随机字符串

    2、    写到用户浏览器的cookie中

    3、    保存到session中

    4、    在随机字符串对应的字典中设置相关内容

    而上述过程在Django中的体现为:

    request.session["username"]=u

    这里的username为通过request.POST.get("username")从前端html页面中获取到的用户名信息

    注意:

    在Django中要用session中一定要先执行:

    python manage.py makemigrations

    python manage.py migrate

    当用户登录的时候的就会在数据库的django_session表中记录session信息

    同样的通过request.session.get("username")也可以获取相应的值

    在这个过程中:

    1、    首先获取当前用户的随机字符串

    2、    根据随机字符串获取对应的内容

    session的操作

    request.session["k1"]  如果不存在则会报错

    request.session.get("k1"),如果不存在则会报错,为了防止出错可以request.session.get('k1',none)

    request.session['k1'] = 123 设置session值

    request.session.setdefault('k1',123)  存在则不设置

    del request.session['k1']  删除

    request.session.clear()    删除

    所有 键、值、键值对

    request.session.keys()

    request.session.values()

    request.session.items()

    request.session.iterkeys()

    request.session.itervalues()

    request.session.iteritems()

    获取当前用户session的随机字符串

    request.session.session_key

    将所有Session失效日期小于当前日期的数据删除

    request.session.clear_expired()

    检查 用户session的随机字符串 在数据库中是否

    request.session.exists("session_key")

    删除当前用户的所有Session数据

    request.session.delete("session_key")

    request.session.set_expiry(value)

    默认的过期时间是两周,如果自己设置了过期时间,这样自己设定的优先级就会高于默认的

    如果value是个整数,session会在些秒数后失效。

    如果value是个datatime或timedelta,session就会在这个时间后失效。

    如果value是0,用户关闭浏览器session就会失效。

    如果value是None,session会依赖全局session失效策略。

    配置setting.py

    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,默认修改之后才保存(默认)

    Django中对于session的存储方式

    Django中支持session,其中内部提供了5种类型的session供开发者使用:

    • 数据库(默认)
    • 缓存
    • 文件
    • 缓存+数据库
    • 加密cookie

    1、如果是数据库,需要在settings.py中配置如下:

    SESSION_ENGINE = 'django.contrib.sessions.backends.db' (引擎(默认))

    2、如果是缓存session,需要在settings.py中配置如下:

    SESSION_ENGINE = 'django.contrib.sessions.backends.cache'(引擎)

    SESSION_CACHE_ALIAS= 'default'  使用的缓存别名(默认内存缓存,也可以是memcache),此处别名依赖缓存的设置

    1、    如果是文件session, 需要在settings.py中配置如下:

    SESSION_ENGINE = 'django.contrib.sessions.backends.file' (引擎)

    SESSION_FILE_PATH=None  缓存文件路径,如果为None,则使用tempfile模块获取一个临时地址tempfile.gettempdir()   

    2、    如果是缓存+数据库session,需要在settings.py中配置如下:

    SESSION_ENGINE='django.contrib.sessions.backends.cached_db'       (引擎)

  • 相关阅读:
    20120110 自己写的基于jquery的翻页效果
    搜来的 可爱的if ie
    哎~~~纠结死了的终于解决的i6的fixed属性
    2011815发现可好的js繁简转换代码 写这些的人。。好厉害呀 收藏了~~~
    网站制作CSS图片转换滤镜代码(貌似只对ie有用。。。)
    2011811 右下角弹出渐隐的广告代码 可以关闭 可以缩小 还各种兼容(ff opera ie6、7、8都试过了)值得保留哎~~~
    20120604 自己写的基于jquery的类似百度贴吧头像提示效果
    UFT textUtil object 解决奇怪问题
    UFT send request & get response
    UFT connect sql (1)
  • 原文地址:https://www.cnblogs.com/cyfiy/p/10235693.html
Copyright © 2020-2023  润新知