作业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/')