zoukankan      html  css  js  c++  java
  • Python

    urls.py:

    from django.conf.urls import url
    from app02 import views
    
    
    urlpatterns = [
        # app02
        url(r'^app02/login/', views.login),
        url(r'^app02/home/', views.home),
        url(r'^app02/index/', views.index),
        url(r'^app02/logout/', views.logout),
    ]
    

    views.py:

    from django.shortcuts import render, redirect
    
    from functools import wraps
    
    
    def check_login(func):
        @wraps(func)
        def inner(request, *args, **kwargs):
            ret = request.session.get("login")
    
    
            if ret == "success":
                # 如果已经登录过
                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
    
    
    def login(request):
        if request.method == "POST":
            username = request.POST.get("user")
            password = request.POST.get("pwd")
            # 从URL里面取到 next 参数
            next_url = request.GET.get("next")
    
            if username == "admin" and password == "admin":
                # 登录成功
                if next_url:
                    rep = redirect(next_url)  # 得到一个响应对象
                else:
                    rep = redirect("/app02/home/")  # 得到一个响应对象
    
                # 设置 session
                request.session["login"] = "success"
                request.session["username"] = username
                request.session.set_expiry(60)   # 60 秒之后失效
                return rep
        ret = request.session.get("login")
        if ret == "success":
            return redirect("/app02/home/")
        else:
            return render(request, "app02/login.html")
    
    
    @check_login
    def home(request):
        username = request.session.get("username")
        return render(request, "app02/home.html", {"username": username})
    
    
    @check_login
    def index(request):
        username = request.session.get("username")
        return render(request, "app02/index.html", {"username": username})
    
    
    # 注销函数
    def logout(request):
        request.session.flush()  # 删除 session 数据和 cookie
        request.session.delete()  # 只删除 session 数据,不删除 cookie
        return render(request, "/app02/login/")
    

    login.html:

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>登录页面</title>
    </head>
    <body>
    
    <p>登录页面</p>
    
    <form action="{{ request.get_full_path }}" method="post">
        {% csrf_token %}
        <p>
            账号:
            <input type="text" name="user">
        </p>
        <p>
            密码:
            <input type="text" name="pwd">
        </p>
        <p>
            <input type="submit" value="登录">
        </p>
    </form>
    
    </body>
    </html>
    

    home.html:

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>个人信息页面</title>
    </head>
    <body>
    
    <p>{{ username }} 的个人信息页面</p>
    
    <a href="/logout/">注销</a>
    
    </body>
    </html>
    

    index.html:

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>主页面</title>
    </head>
    <body>
    
    <p>{{ username }} 的主页面</p>
    
    <a href="/logout/">注销</a>
    
    </body>
    </html>
    

    访问,http://127.0.0.1:8888/app02/login/

    输入 admin、admin,点击登录

    显示 mysite3.django_session 这个表不存在
    执行命令:
    manage.py@mysite3 > makemigrations
    manage.py@mysite3 > migrate
    

    再看一下数据库

    点进去看一下字段

    expire_date 是 session 的过期时间

    生成 table 之后,再来到 login 页面登录

    登录成功

    session 的基本操作:

    request.session['login'] = 'false'  # 设置 session 中的数据
    request.session.get('login')  # 通过 key 来获取 session 中的数据
    request.session.exists("login")  # 判断 session 的 login 在数据库中是否存在
    request.session.setdefault('login', 'false')  # 为 session 的 key 设置默认值 false
    del request.session['login']  # 删除 session 的 key 中的数据
    request.session.delete()  # 删除当前会话的所有 session 数据
    request.session.flush()  # 删除当前的 session 数据并删除 cookie
    request.session.clear_expired()  # 将所有过期的 session 数据删除
    request.session.session_key # 会话 session 的 key
    
    
    # 获取 session(字典) 中的所有 键、值、键值对
    request.session.keys()  # 提取所有键
    request.session.values()  # 提取所有值
    request.session.items()  # 提取所有键值对
    request.session.iterkeys()  # 迭代键
    request.session.itervalues()  # 迭代值
    request.session.iteritems()  # 迭代键值对
    
    
    # 设置会话 session 和 cookie 的超时时间
    request.session.set_expiry(value)
    # 如果 value 是个整数 n,session 会在 n 秒后失效
    # 如果 value 是个 datatime 或 timedelta,session 就会在这个时间后失效
    # 如果 value 是 0,用户关闭浏览器 session 就会失效
    # 如果 value 是 None,session 会依赖全局 session 失效策略
    

    settings.py 中的 session 配置:

    # 设置数据库 session
    SESSION_ENGINE = 'django.contrib.sessions.backends.db'   # 引擎(默认)
    
    # 设置缓存 session
    SESSION_ENGINE = 'django.contrib.sessions.backends.cache'  # 引擎
    SESSION_CACHE_ALIAS = 'default'                            # 使用的缓存别名(默认内存缓存,也可以是 memcache),此处别名依赖缓存的设置
    
    # 设置文件 session
    SESSION_ENGINE = 'django.contrib.sessions.backends.file'    # 引擎
    SESSION_FILE_PATH = None                                    # 缓存文件路径,如果为 None,则使用 tempfile 模块获取一个临时地址 tempfile.gettempdir() 
    
    # 设置缓存、数据库 session
    SESSION_ENGINE = 'django.contrib.sessions.backends.cached_db'        # 引擎
    
    # 加密 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,默认修改之后才保存(默认)
    
  • 相关阅读:
    A1066 Root of AVL Tree (25 分)
    A1099 Build A Binary Search Tree (30 分)
    A1043 Is It a Binary Search Tree (25 分) ——PA, 24/25, 先记录思路
    A1079; A1090; A1004:一般树遍历
    A1053 Path of Equal Weight (30 分)
    A1086 Tree Traversals Again (25 分)
    A1020 Tree Traversals (25 分)
    A1091 Acute Stroke (30 分)
    A1103 Integer Factorization (30 分)
    A1032 Sharing (25 分)
  • 原文地址:https://www.cnblogs.com/sch01ar/p/11440893.html
Copyright © 2011-2022 走看看