• Python


    urls.py:

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

    views.py:

    from django.shortcuts import render, redirect
    from app01 import models
    
    from functools import wraps
    
    
    # 登录校验的装饰器
    def check_login(func):
        @wraps(func)  # 装饰器修复技术
        def inner(request, *args, **kwargs):
            ret = request.get_signed_cookie("login", default="0", salt="whoami")
            if ret == "success":
                # 已经登录过,继续执行
                return func(request, *args, **kwargs)
            else:
                # 否则跳转到登录页面
                next_url = request.path_info  # 获取当前访问的 URL
                # next_url = request.get_full_path()  # 获取当前请求的路径和参数
                return redirect("/login/?next={}".format(next_url))
        return inner
    
    
    def login(request):
        if request.method == "POST":
            username = request.POST.get("user")
            password = request.POST.get("pwd")
            next_url = request.GET.get("next")
    
            if username == "admin" and password == "admin":
                if next_url:
                    rep = redirect(next_url)  # 得到一个响应对象
                else:
                    rep = redirect("/home/")  # 得到一个响应对象
                # rep.set_cookie("login", "success")  # 设置 cookie
                rep.set_signed_cookie("login", "success", salt="whoami")  # 设置 cookie 并加盐
                return rep
    
        ret = request.get_signed_cookie("login", default="0", salt="whoami")
        if ret == "success":
            return redirect("/home/")  # 如果已经登录过,再访问 login,直接跳转到 home
        else:
            return render(request, "login.html")
    
    
    def home(request):
        # ret = request.COOKIES.get("login")  # 获取 cookie 的 value
        ret = request.get_signed_cookie("login", default="0", salt="whoami")  # 获取加盐后 cookie 的 value
        if ret == "success":
            # cookie 验证成功
            return render(request, "home.html")
        else:
            return redirect("/login/")
    
    
    @check_login
    def index(request):
        return render(request, "index.html")
    
    
    # 注销函数
    def logout(request):
        rep = redirect("/login/")
        rep.delete_cookie("login")  # 删除 cookie
        return rep
    

    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>个人信息页面</p>
    
    <a href="/logout/">注销</a>
    
    </body>
    </html>
    

    index.html:

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>主页面</title>
    </head>
    <body>
    
    <p>主页面</p>
    
    </body>
    </html>
    

    访问,http://127.0.0.1:8888/index/

    输入,admin、admin

    直接跳转到了 index 页面
    这时再访问 login 页面,就会跳转到 home 页面

    点击 “注销”

     回到了登录界面

  • 相关阅读:
    Android Animations动画使用详解
    android LinearLayout和RelativeLayout实现精确布局
    中国天气网API
    获取中央气象台API 完整城市列表简单方式
    Django框架 连接Oracle -ServerName方式报错
    关于java的动态代理
    Mybatis缓存
    Git使用,将本地项目推送到GitHub上
    使用doxc4j将word转pdf遇到的一个问题
    linux安装jdk
  • 原文地址:https://www.cnblogs.com/sch01ar/p/11440750.html
Copyright © 2020-2023  润新知