主要以 Django+DRF + Vue的开发模式,简单介绍以 jwt作为凭证,实现 用户注册、登录 一系列流程
以 Django 作为服务端
环境搭建
pip install django django-cors-headers djangorestframework djangorestframework-jwt
项目配置信息
djangodemo/settings.py
INSTALLED_APPS = [
...,
'rest_framework',
'corsheaders',
'users'
]
MIDDLEWARE = [
'django.middleware.security.SecurityMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'corsheaders.middleware.CorsMiddleware',
'django.middleware.common.CommonMiddleware',
# 'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
]
# 跨域参数,允许所有源访问
CORS_ORIGIN_ALLOW_ALL = True
# 自定义用户模型类
AUTH_USER_MODEL = 'users.UserModel'
用户模型类
users/models.py
from django.db import models
from django.contrib.auth.models import AbstractUser
class UserModel(AbstractUser):
"""继承django内置的用户类,并重写,注意:必须在settings.py中指明"""
phone = models.CharField(max_length=11, unique=True, verbose_name='手机')
class Meta:
ordering = ['id']
db_table = 'db_user'
verbose_name = '用户'
verbose_name_plural = '用户'
def __str__(self):
return self.username
序列化类
users/ser.py
from rest_framework import serializers
from .models import UserModel
from django.contrib.auth.hashers import make_password
import re
class UserSerializer(serializers.ModelSerializer):
def create(self, validated_data):
return UserModel.objects.create_user(**validated_data)
def update(self, instance, validated_data):
instance.username = validated_data.get('username', instance.username)
instance.phone = validated_data.get('phone', instance.phone)
instance.email = validated_data.get('email', instance.email)
password = validated_data['password']
if not password:
instance.password = make_password(password)
instance.save()
return instance
def validate_password(self, value):
"""
验证密码不能全是小写字母,不能全是大写字母,也不能全是数字
"""
if not re.match(r'(?!^\d*$)(?![a-z]$)(?![A-Z]$).{6,}$', value):
raise serializers.ValidationError('密码等级不够')
return value
def validate_phone(self, value):
"""
校验手机号是否合法
"""
if not re.match(r'1[3-7]\d{9}$', value):
raise serializers.ValidationError('手机号不合法')
return value
class Meta:
model = UserModel
fields = ('id', 'username',