Django开发之自定义User
前言:Django 内置模块 contrib.auth 预置了一张用户表 user ,如果不符合我们的需求,我们可以自定义User表,增加一些我们需要的字段,来完成我们自己的User表。
1.自定义User表
同样,我们新建一个flyuser的应用,同样移到apps文件夹下,然后在settings里面添加这个应用。
在flyuser下的models添加以下代码:
from django.db import models
from django.contrib.auth.models import AbstractUser
class FlyUser(AbstractUser):
id = models.BigAutoField(primary_key=True)
# 用户类型
usertype = models.PositiveIntegerField()
# 真实姓名
realname = models.CharField(max_length=30, db_index=True)
class Meta:
db_table = "fly_user"
然后再settings.py文件中添加如下设置:
AUTH_USER_MODEL = 'flyuser.User'
然后进行生成和迁移fly_user表。
2.设置url路由
同样在flyuser新建urls.py文件添加如下代码:
from django.urls import path
from apps.flyuser import views
urlpatterns = [
path('register',views.register), #注册
path('login',views.log),#登录
path('quit',views.quit)#退出
]
编辑django_demo目录下的urls.py
3.处理注册、登录、退出请求
编写flyuser下的views.py
from django.contrib.auth import authenticate, login, logout
from django.contrib.auth.hashers import make_password
from django.http import JsonResponse
from apps.flyuser.models import FlyUser
def register(request):
"""注册"""
userName = request.POST.get('username')
passWord = request.POST.get('password')
realName = request.POST.get('realname')
try:
if FlyUser.objects.filter(username=userName).exists():
return {'ret': 1, 'msg': f'登录名 {userName} 已经存在'}
user = FlyUser.objects.create(
username=userName,
password=make_password(passWord),
usertype=1,
realname=realName
)
return {'ret': 0, 'id': user.id}
except:
return {'ret': 1, 'msg': '错误信息'}
def log(request):
"""登录"""
if request.session.has_key('islogin'):
username = request.session["username"]
return JsonResponse({'ret': 0,'msg':'{}已经登陆成功'.format(username)})
userName = request.POST.get('username')
passWord = request.POST.get('password')
# 使用 Django auth 库里面的 方法校验用户名、密码
user = authenticate(username=userName, password=passWord)
# 如果能找到用户,并且密码正确
if user is not None:
if user.is_active:
login(request, user)
# 只要session中有islogin,就认为用户已登录
request.session['islogin'] = True #用浏览器才能测试出效果
# 记住登录的用户名
request.session['username'] = user.username
return JsonResponse({'ret': 0})
else:
return JsonResponse({'ret': 1, 'msg': '用户已经被禁用'})
# 否则就是用户名、密码有误
else:
return JsonResponse({'ret': 1, 'msg': '用户名或者密码错误'})
def quit(request):
"""退出"""
logout(request)
return JsonResponse({'ret': 0})
4.测试
import requests,pprint
def register():
payload = {
'username':'fly',
'password':'123456',
'realname':'王大爷'
}
response = requests.post('http://127.0.0.1:8000/api/flyuser/register',data=payload)
pprint.pprint(response.json())
def login():
payload = {
'username':'fly',
'password':'123456'
}
response = requests.post('http://127.0.0.1:8000/api/flyuser/login',data=payload)
pprint.pprint(response.json())
if __name__ == '__main__':
# register()
login()
结束!!!