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()

結束!!!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章