zoukankan      html  css  js  c++  java
  • session实现登陆验证(附带演示CBV添加装饰器的方式)

    一、urls.py

    urlpatterns = [
        url(r'^admin/', admin.site.urls),
        url(r'^$', views.home, name='home'),
        url('^login/', views.login),
        url('^page_1/', views.Page_1.as_view()),
        url('^page_2/', views.page_2),
        url('^logoff/', views.logoff)
    ]

    二、views.py

    from django.shortcuts import render, HttpResponse, redirect
    from django import views
    from django.utils.decorators import method_decorator
    
    
    # Create your views here.
    
    def login(request):
        if request.method == 'POST':
            post_username = request.POST.get('post_username').strip()
            post_password = request.POST.get('post_password').strip()
            if post_username == 'tom' and post_password == '111':
                request.session['login_tag'] = post_username
                # request.session.set_expiry()
                tar_url = request.GET.get('tar_url')
                if tar_url:
                    return redirect(tar_url)
                return redirect('home')
            return HttpResponse('账号或密码错误')
        return render(request, 'login_page.html')
    
    
    def add_login(func):
        def passer(request, *args, **kwargs):
            if request.session.get('login_tag'):
                res = func(request, *args, **kwargs)
                return res
            else:
                tar_url = request.get_full_path()
                return redirect('/login/?tar_url={}'.format(tar_url))
    
        return passer
    
    
    def home(request):
        return render(request, 'home_page.html')
    
    
    # 方式二,指定给某个方法添加指定的装饰器
    # @method_decorator(add_login, name='post')
    # @method_decorator(add_login, name='get')
    class Page_1(views.View):
        @method_decorator(add_login)  # 方式三,给类下面所有方法统一添加指定的装饰器
        def dispatch(self, request, *args, **kwargs):
            return super().dispatch(request, *args, **kwargs)
    
        # @method_decorator(add_login)  # 方式一,单给下面这个方法添加指定的装饰器
        def get(self, request):
            return HttpResponse('page_1的get')
    
        def post(self, request):
            return HttpResponse('page_1的post')
    
    
    @add_login
    def page_2(request):
        return HttpResponse('page_2')
    
    
    @add_login
    def logoff(request):
        old_username = request.session.get('login_tag')
        request.session.flush()
        return HttpResponse('成功注销[{}]'.format(old_username))

    三、templates

      1、home_page.html:

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
        {% load static %}
        <script src="{% static 'jQuery351.js' %}"></script>
        <link rel="stylesheet" href="{% static 'Bootstrap337/css/bootstrap.min.css' %}">
        <script src="{% static 'Bootstrap337/js/bootstrap.min.js' %}"></script>
    </head>
    <body>
    <h1>主页</h1>
    <p><a href="login">点击跳转登录</a></p>
    <p><a href="page_1">去1号页面的get</a></p>
    <form action="/page_1/" method="post">
        <p><input type="submit" value="去1号页面post"></p>
    </form>
    <p><a href="page_2">去2号页面</a></p>
    <p><a href="logoff">注销登录</a></p>
    </body>
    </html>

      2、login_page.html:

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
        {% load static %}
        <script src="{% static 'jQuery351.js' %}"></script>
        <link rel="stylesheet" href="{% static 'Bootstrap337/css/bootstrap.min.css' %}">
        <script src="{% static 'Bootstrap337/js/bootstrap.min.js' %}"></script>
    </head>
    <body>
    <form action="" method="post" novalidate>
        <p><label for="">username:<input type="text" name="post_username"></label></p>
        <p><label for="">password:<input type="password" name="post_password"></label></p>
        <p><input type="submit" value="登录"></p>
    </form>
    </body>
    </html>
  • 相关阅读:
    hdu 1863 畅通工程(Kruskal+并查集)
    1.1.2最小生成树(Kruskal和Prim算法)
    1.1.1最短路(Floyd、Dijstra、BellmanFord)
    ACM复习专项
    装饰器和偏函数
    Python函数基础
    (六)面向对象高级编程
    Zabbix漏洞利用 CVE-2016-10134
    Struts-S2-045漏洞利用
    F5 BIG-IP 远程代码执行漏洞环境搭建
  • 原文地址:https://www.cnblogs.com/caoyu080202201/p/13060692.html
Copyright © 2011-2022 走看看