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()
結束!!!