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>
原文地址:https://www.cnblogs.com/caoyu080202201/p/13060692.html