django login logout request使用

情景一

User表繼承django默認的AbstractUser

class User(AbstractUser):
    state = models.CharField(max_length=1, default=1)

    def __str__(self):
        return self.state

需要在settings中添加配置項目:

AUTH_USER_MODEL = 'li.User'
# AUTH_USER_MODEL = '某個app.User'

登錄\退出 邏輯代碼

from django.contrib import auth
from django.contrib.auth import login
from django.contrib.auth.decorators import login_required
from django.shortcuts import render, redirect
from django.views import View
from li.models import *
from django.http import JsonResponse


class Login(View):
    def get(self, request):
        return render(request, 'login.html')

    def post(self, request):
        params = request.POST
        name = params.get('name')
        pwd = params.get('password')


        user = auth.authenticate(username=name, password=pwd)
        if user:
            login(request, user)
            return redirect('/home/')
		return JsonResponse({"code":0, "msg":"登錄失敗"}, json_dumps_params={'ensure_ascii': False}, safe=False)


class Logout(View):
    def post(self, request):
        if request.user:
            logout(request)
        return JsonResponse({"code": 0, "msg": "退出成功"}, json_dumps_params={'ensure_ascii': False}, safe=False)

情景二

User表不繼承django默認的AbstractUser

其中的last_login字段是必須的,在使用login()時會使用

class MyUser(models.Model):
    username = models.CharField(max_length=12)
    password = models.CharField(max_length=12)
    last_login = models.DateTimeField(null=True, blank=True)

    def __str__(self):
        return self.username

這個時候如果想使用request.user,必須在settings中添加配置項目:

AUTHENTICATION_BACKENDS = (
    'li.myAuth.auth.ZhUserBackend',
)

此爲函數:

class ZhUserBackend(object):
    """
    自定義用戶驗證
    """
    def authenticate(self, request, username=None, password=None, **kwargs):
        from li.models import MyUser
        try:
            user = MyUser.objects.get(username=username)
            if user:
                return user

        except Exception as e:
            return None

    def get_user(self, user_id):
        from li.models import MyUser
        return MyUser.objects.get(id=user_id)

這樣才能在其他路由中繼續使用request.user

登錄\退出 邏輯代碼

from django.contrib import auth
from django.contrib.auth import login, logout
from django.contrib.auth.decorators import login_required
from django.http import JsonResponse
from django.shortcuts import render, redirect
from django.views import View
from li.models import *


class Login(View):
    def get(self, request):
        return render(request, 'login.html')

    def post(self, request):
        params = request.POST
        name = params.get('name')
        pwd = params.get('password')
        user = auth.authenticate(username=name, password=pwd)
        if user:
            login(request, user)
            return redirect('/home/')
        return JsonResponse({"code":0, "msg":"登錄失敗"}, json_dumps_params={'ensure_ascii': False}, safe=False)


class Logout(View):
    def post(self, request):
        if request.user:
            logout(request)
        return JsonResponse({"code": 0, "msg": "退出成功"}, json_dumps_params={'ensure_ascii': False}, safe=False)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章