• Session设置


     

    from django.shortcuts import render, redirect
    from django import views
    
    # Create your views here.
    from functools import wraps
    # Django提供的工具,把函数装饰器转变成方法装饰器
    from django.utils.decorators import method_decorator
    from django.views.decorators.csrf import csrf_exempt, csrf_protect
    
    
    def check_login(func):
        @wraps(func)  # 装饰器修复技术
        def inner(request, *args, **kwargs):
            ret = request.session.get("is_login")
            # 1. 获取cookie中的随机字符串
            # 2. 根据随机字符串去数据库取 session_data --> 解密 --> 反序列化成字典
            # 3. 在字典里面 根据 is_login 取具体的数据
            if ret == "1":
                # 已经登陆过的 继续执行
                return func(request, *args, **kwargs)
            # 没有登录过的 跳转到登录页面
            else:
                # 获取当前访问的URL
                next_url = request.path_info
                print(next_url)
                return redirect("/app02/login/?next={}".format(next_url))
        return inner
    
    
    @csrf_exempt
    def login(request):
        if request.method == "POST":
            user = request.POST.get("user")
            pwd = request.POST.get("pwd")    
            # 从URL里面取到 next 参数
            next_url = request.GET.get("next")
    
            if user == "alex" and pwd == "dsb":
                # 登陆成功
                # 告诉浏览器保存一个键值对
    
                if next_url:
                    rep = redirect(next_url)  # 得到一个响应对象
                else:
                    rep = redirect("/app02/home/")  # 得到一个响应对象
                # 设置session
                request.session["is_login"] = "1"
                request.session["name"] = user
                request.session.set_expiry(7)  # 7秒钟之后失效    这个失效指的是 cookie失效, session保存在数据库的数据没有失效(通过clear方法删除数据库数据)
                return rep
    
        return render(request, "app02/login.html")
    
    
    @check_login
    def home(request):
        user = request.session.get("name")
        return render(request, "app02/home.html", {"user": user})
    
    
    @check_login
    def index(request):
    
        return render(request, "app02/index.html")
    
    
    # 注销函数
    def logout(request):
        # 只删除session数据
        # request.session.delete()
        # 如何删除session数据和cookie
        request.session.flush()
        return redirect("/app02/login/")
    
    
    # @method_decorator(check_login, name="get")
    class UserInfo(views.View):
    
        @method_decorator(check_login)
        def get(self, request):
            return render(request, "app02/userinfo.html")
    

      

     Session的配置

    1. 数据库Session
    SESSION_ENGINE = 'django.contrib.sessions.backends.db'   # 引擎(默认)
    
    2. 缓存Session
    SESSION_ENGINE = 'django.contrib.sessions.backends.cache'  # 引擎
    SESSION_CACHE_ALIAS = 'default'                            # 使用的缓存别名(默认内存缓存,也可以是memcache),此处别名依赖缓存的设置
    
    3. 文件Session
    SESSION_ENGINE = 'django.contrib.sessions.backends.file'    # 引擎
    SESSION_FILE_PATH = None                                    # 缓存文件路径,如果为None,则使用tempfile模块获取一个临时地址tempfile.gettempdir() 
    
    4. 缓存+数据库
    SESSION_ENGINE = 'django.contrib.sessions.backends.cached_db'        # 引擎
    
    5. 加密Cookie Session
    SESSION_ENGINE = 'django.contrib.sessions.backends.signed_cookies'   # 引擎
    
    其他公用设置项:
    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,默认修改之后才保存(默认)
    

      

  • 相关阅读:
    vmware虚拟机安装centos,配置PHP、mysql
    Java初学者不得不知的概念,JDK,JRE,JVM的区别?(转)
    char a[] = "hello world1"和char *p = "hello world2";的区别(转)
    关于二维数组传参做形参(转)
    最长连续字母序列的长度(阿里2015在线研发工程师笔试题)
    两个线程并发执行以下代码,假设a是全局变量,那么以下输出______是不可能的?
    软件工程
    面向对象基础
    eclipse
    设计模式(java)--状态模式
  • 原文地址:https://www.cnblogs.com/mengbin0546/p/10846208.html
Copyright © 2020-2023  润新知