1.解決使用系統(tǒng)自帶登錄功能時(shí),出現(xiàn)403錯(cuò)誤的方法,注釋如下代碼
djg3->settings->MIDDLEWSRE:
MIDDLEWARE = [
'django.middleware.security.SecurityMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
# 提交時(shí)必須注釋
# 'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
]
2.用戶(hù)沒(méi)登錄時(shí)乞旦,訪(fǎng)問(wèn)需要登錄才能訪(fǎng)問(wèn)的html時(shí)膏斤,默認(rèn)跳轉(zhuǎn)的路徑
djg3->settings->末尾添加
LOGIN_URL='/user/login/'
3.users->urls.py
from django.conf.urls import url
from django.contrib.auth.decorators import login_required
from user import views
urlpatterns=[
# 登錄
url(r'^login/',views.login,name='login'),
# 注冊(cè)
url(r'^register/',views.register,name='register'),
# login_required 登錄后才能使用的路由
# 首頁(yè)
url(r'^index/',login_required(views.index),name='index'),
# 注銷(xiāo)
url(r'^logout/',login_required(views.logout),name='logout'),
]
4.users->views.py
from django.contrib import auth
from django.contrib.auth.models import User
from django.http import HttpResponseRedirect, HttpResponse
from django.shortcuts import render
from django.urls import reverse
from users.forms import UserForm, LoginForm
def register(request):
if request.method=='GET':
return render(request,'register.html')
if request.method=='POST':
#校驗(yàn)頁(yè)面中傳遞的參數(shù)瞻佛,是否填寫(xiě)完整
form = UserForm(request.POST)
#is_valid():判斷表單驗(yàn)證是否通過(guò)
if form.is_valid():
# 獲取校驗(yàn)后的用戶(hù)和密碼
username=form.cleaned_data.get('username')
password1 = form.cleaned_data.get('password1')
password2 = form.cleaned_data.get('password2')
# 判斷密碼是否相同
# 創(chuàng)建普通用戶(hù)creat_user,創(chuàng)建超級(jí)管理員用戶(hù)create_superuser
User.objects.create_user(username=username,password=password1)
# 實(shí)現(xiàn)跳轉(zhuǎn)
return HttpResponseRedirect(reverse('users:login'))
else:
return render(request,'register.html',{'form':form})
def login(request):
if request.method=='GET':
return render(request,'login.html')
if request.method=='POST':
#表單驗(yàn)證诗良,用戶(hù)名和密碼是否填寫(xiě)货邓,校驗(yàn)用戶(hù)名是否注冊(cè)
form =LoginForm(request.POST)
if form.is_valid():
# 校驗(yàn)用戶(hù)名和密碼怎茫,判斷返回的對(duì)象是否為空诊杆,如果不為空捉腥,則為user對(duì)象
user=auth.authenticate(username=form.cleaned_data['username'],
password=form.cleaned_data['password'])
if user:
# 用戶(hù)名和密碼都是正確的氓拼,則登錄
#進(jìn)入登錄狀態(tài),滿(mǎn)足login_required要求
auth.login(request,user)
#跳轉(zhuǎn)頁(yè)面
return HttpResponseRedirect(reverse('users:index'))
else:
# 密碼不正確
return render(request,'login.html',{'error':'密碼錯(cuò)誤'})
else:
return render(request,'login.html',{'form':form})
def index(request):
if request.method=='GET':
return render(request,'index.html')
def logout(request):
if request.method=='GET':
# 注銷(xiāo)
#取消login_required的登錄狀態(tài),進(jìn)入未登錄狀態(tài)
auth.logout(request)
#跳轉(zhuǎn)頁(yè)面
return HttpResponseRedirect(reverse('users:login'))
5.users->forms
'''
導(dǎo)入規(guī)則順序
1.新引入python自帶的庫(kù)
2.引入地方
3.引入自定義的
'''
from django import forms
from django.contrib.auth.models import User
class UserForm(forms.Form):
username=forms.CharField(required=True,
max_length=5,
min_length=2,
error_messages={
'required':'用戶(hù)名必填',
'max_length':'用戶(hù)名不能超過(guò)7個(gè)字符',
'min_length':'用戶(hù)名至少兩個(gè)字符'
})
password1=forms.CharField(required=True,
min_length=6,
error_messages={
'required':'密碼必填',
'min_length':'密碼不能少于6位'
})
password2=forms.CharField(required=True,
min_length=6,
error_messages={
'required':'確認(rèn)密碼必填',
'min_length':'確認(rèn)密碼不能少于6個(gè)'
})
def clean(self):
# 校驗(yàn)用戶(hù)名是否已經(jīng)注冊(cè)過(guò)
user=User.objects.filter(username=self.cleaned_data.get('username'))
if user:
raise forms.ValidationError({'username':'用戶(hù)名已存在'})
# 校驗(yàn)密碼和確認(rèn)密碼是否相同
if self.cleaned_data.get('password1')!=self.cleaned_data.get('password2'):
raise forms.ValidationError({'password2':'兩次密碼不一致'})
return self.cleaned_data
class LoginForm(forms.Form):
username = forms.CharField(required=True,
max_length=5,
min_length=2,
error_messages={
'required': '用戶(hù)名必填',
'max_length': '用戶(hù)名不能超過(guò)7個(gè)字符',
'min_length': '用戶(hù)名至少兩個(gè)字符'
})
password = forms.CharField(required=True,
min_length=6,
error_messages={
'required': '密碼必填',
'min_length': '密碼不能少于6位'
})
def clean(self):
user = User.objects.filter(username=self.cleaned_data['username'])
if not user:
raise forms.ValidationError({'username': '用戶(hù)名不存在,請(qǐng)注冊(cè)'})
return self.cleaned_data
6.templates web頁(yè)面
1)base.html 父模板
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>
{% block title %}
{% endblock %}
</title>
</head>
{% block extCss %}
{% endblock %}
{% block extJs %}
{% endblock %}
<body>
{% block content %}
{% endblock %}
</body>
</html>
2)base_main.html 設(shè)置js
{% extends 'base.html' %}
{% block extJs %}
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.3.2/jquery.min.js"type="text/javascript"></script>
{% endblock %}
3)login 登錄頁(yè)面
{% extends 'base_main.html' %}
{% block title %}
登錄
{% endblock %}
{% block content %}
<form action="" method="post">
{{form.errors.username}}
<p>姓名:<input type="text" name="username"></p>
{{form.errors.password}}
<p>密碼:<input type="password" name="password"></p>
<input type="submit" value="登錄">
</form>
{% endblock %}
4)register.html 注冊(cè)頁(yè)面
{% extends 'base_main.html' %}
{% block title %}
登錄
{% endblock %}
{% block content %}
<form action="" method="post">
{{form.errors.username}}
<p>姓名:<input type="text" name="username"></p>
{{form.errors.password}}
<p>密碼:<input type="password" name="password"></p>
<input type="submit" value="登錄">
</form>
{% endblock %}
5)index.html 首頁(yè)
{% extends 'base_main.html' %}
{% block title %}
首頁(yè)
{% endblock %}
{% block content %}
<p>我是首頁(yè)桃漾,需要登錄才能訪(fǎng)問(wèn)</p>
<p><a href="{% url 'users:logout' %}">注銷(xiāo)</a></p>
{% endblock %}