登入註冊功能——Django
阿新 • • 發佈:2019-01-03
一、定義使用者模型
- user/models.py
from django.db import models
from django.contrib.auth.hashers import make_password
class User(models.Model):
nickname = models.CharField(max_length=64, unique=True, null=False, blank=False)
password = models.CharField(max_length=64, null=False, blank=False)
head = models.ImageField()
age = models.IntegerField()
sex = models.IntegerField()
def save(self):
if not self.password.startswith('pbkdf2_'):
self.password = make_password(self.password)
super().save()
二、定義form表單模型
from django.forms import Form, ModelForm, CharField
from django.contrib.auth.hashers import check_password
from user.models import User
#登錄檔單
class RegisterForm(ModelForm):
class Meta:
model = User
fields = ['nickname', 'password', 'head', 'age', 'sex']
#登入表單
class LoginForm(Form):
nickname = CharField(max_length=64)
password = CharField(max_length=64)
def chk_password(self):
nickname = self.cleaned_data['nickname' ]
password = self.cleaned_data['password']
try:
user = User.objects.get(nickname=nickname)
return user, check_password(password, user.password)
except:
return None, False
三、登入註冊檢視函式
- user/views.py
from django.shortcuts import render, redirect
from user.forms import RegisterForm, LoginForm
#註冊
def register(request):
if request.method == 'POST':
form = RegisterForm(request.POST, request.FILES)
if form.is_valid():
user = form.save(commit=False)
user.save()
request.session['uid'] = user.id
return redirect('/user/info/')
else:
return render(request, 'register.html', {'errors': form.errors})
return render(request, 'register.html')
#登入
def login(request):
if request.method == 'POST':
form = LoginForm(request.POST)
if form.is_valid():
user, passed = form.chk_password()
if passed:
request.session['uid'] = user.id
return redirect('/user/info/')
else:
return render(request, 'login.html', {'errors': form.errors})
return render(request, 'login.html')
#使用者詳情
def info(request):
user = getattr(request, 'user', None)
if user is None:
return redirect('/user/login/')
else:
return render(request, 'info.html', {'user': user})
#退出登入
def logout(request):
request.session.flush()
return redirect('/post/home/')
四、登入驗證的中介軟體
- user/middleware.py
from django.shortcuts import redirect
from django.utils.deprecation import MiddlewareMixin
from user.models import User
class AuthenticationMiddleware(MiddlewareMixin):
def process_request(self, request):
uid = request.session.get('uid')
if uid is not None:
user = User.objects.get(id=uid)
request.user = user
五、在配置檔案中加入驗證中介軟體
- setting.py
MIDDLEWARE = [
'django.middleware.security.SecurityMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'user.middleware.AuthenticationMiddleware', #登入驗證中介軟體
]