作业36

作业36

session实现登录认证

注意: 要执行数据库迁移命令,创建django_session表

项目目录

urls.py

from django.conf.urls import url
from django.contrib import admin
from app01 import views

urlpatterns = [
    url(r'^admin/', admin.site.urls),
    url(r'^home/',views.home),
    url(r'^login/',views.login),
    url(r'^func1/',views.func1),
    url(r'^func2/',views.func2),
    url(r'^func3/',views.func3),
    url(r'^logout',views.logout)
]

templates

=====================func1===============================
<body>
<h1>func1</h1>
<a href="/logout/">注销</a>
</body>
=====================func1===============================





=====================func2===============================
<body>
<h1>func2</h1>
<a href="/logout/">注销</a>
</body>
=====================func2===============================





=====================func3===============================
<body>
<h1>func3</h1>
<a href="/logout/">注销</a>
</body>
=====================func3===============================





=====================home===============================
<body>
<p>我是主页</p>
<a href="/login/">登录</a>
<a href="/login/">注册</a>
</body>
=====================home===============================





=====================login===============================
<body>

<form action="" novalidate method="post">
    {% for form in form_obj %}
        <p>{{ form.label }}:{{ form }}  <span style="color: red">{{ form.errors.0 }}</span></p>
    {% endfor %}
    <button class="btn btn-primary">登录</button>
</form>

</body>
=====================login===============================

app01

views.py

from django.shortcuts import render, redirect
from django import forms


# Create your views here.

class MyForm(forms.Form):
    username = forms.CharField(max_length=5, required=True)
    password = forms.CharField(max_length=10)


def home(request):
    return render(request, 'home.html')


# 注释部分为cookie实现的部分
# def auth(func):
#     def wrapper(request, *args, **kwargs):
#         username = request.COOKIES.get('username')
#         if username:
#             password = request.COOKIES.get('password')
#             if username == 'wu' and password == '123':
#                 res = func(request, *args, **kwargs)
#                 return res
#             else:
#                 return redirect('/login/')
#         else:
#             url = request.get_full_path()
#             return redirect(f'/login/?next={url}')
#
#     return wrapper
#
#
# def login(request):
#     form_obj = MyForm()
#     if request.method == 'POST':
#         form_obj = MyForm(request.POST)
#         url = request.GET.get('next')
#         if form_obj.is_valid():
#             username = request.POST.get('username')
#             password = request.POST.get('password')
#             if username == 'wu' and password == '123':
#                 if url:
#                     obj = redirect(url)
#                 else:
#                     obj = redirect('/home/')
#                 obj.set_cookie('username', username)
#                 obj.set_cookie('password', password)
#                 return obj
#             else:
#                 form_obj.add_error('password', '密码错误')
#                 return render(request, 'login.html', locals())
#
#     return render(request, 'login.html', locals())




def auth(func):
    def wrapper(request, *args, **kwargs):
        if request.session.get('username'):
            username = request.session.get('username')
            password = request.session.get('password')
            if username == 'wu' and password == '123':
                res = func(request, *args, **kwargs)
                return res
        path = request.get_full_path()
        return redirect(f'/login/?next={path}')

    return wrapper



def login(request):
    form_obj = MyForm()
    if request.method == 'POST':
        form_obj = MyForm(request.POST)
        if form_obj.is_valid():
            username = request.POST.get('username')
            password = request.POST.get('password')
            if username == 'wu' and password == '123':
                request.session['username'] = username
                request.session['password'] = password
                url = request.GET.get("next")
                if url:
                    obj = redirect(url)
                else:
                    obj = redirect('/home/')
                return obj
            else:
                form_obj.add_error('password','密码错误')
    return render(request, 'login.html', locals())


@auth
def func1(request):
    return render(request, 'func1.html')


@auth
def func2(request):
    return render(request, 'func2.html')


@auth
def func3(request):
    return render(request, 'func3.html')


@auth
def logout(request):
    request.session.flush()
    return redirect('/login/')
原文地址:https://www.cnblogs.com/achai222/p/13062525.html