最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Django自定義用戶(hù)認(rèn)證示例詳解

 更新時(shí)間:2018年03月14日 11:34:27   作者:我的胡子有點(diǎn)扎  
這篇文章主要給大家介紹了關(guān)于Django自定義用戶(hù)認(rèn)證的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧。

前言

Django附帶的認(rèn)證對(duì)于大多數(shù)常見(jiàn)情況來(lái)說(shuō)已經(jīng)足夠了,但是如何在 Django 中使用自定義的數(shù)據(jù)表進(jìn)行用戶(hù)認(rèn)證,有一種較為笨蛋的辦法就是自定義好數(shù)據(jù)表后,使用OnetoOne來(lái)跟 Django 的表進(jìn)行關(guān)聯(lián),類(lèi)似于這樣:

from django.contrib.auth.models import User
class UserProfile(models.Model):
 """
 用戶(hù)賬號(hào)表
 """
 user = models.OneToOneField(User)
 name = models.CharField(max_length=32)
 def __str__(self):
  return self.name
 class Meta:
  verbose_name_plural = verbose_name = "用戶(hù)賬號(hào)"
  ordering = ['id']

這樣做雖然可以簡(jiǎn)單、快速的實(shí)現(xiàn),但是有一個(gè)問(wèn)題就是我們?cè)谧约旱谋碇袆?chuàng)建一個(gè)用戶(hù)就必須再跟 admin 中的一個(gè)用戶(hù)進(jìn)行關(guān)聯(lián),這簡(jiǎn)直是不可以忍受的。

admin代替默認(rèn)User model

寫(xiě)我們自定義的 models 類(lèi)來(lái)創(chuàng)建用戶(hù)數(shù)據(jù)表來(lái)代替默認(rèn)的User model,而不與django admin的進(jìn)行關(guān)聯(lián),相關(guān)的官方文檔在這里

👾戳我

from django.db import models
from django.contrib.auth.models import User
from django.contrib.auth.models import (
 BaseUserManager, AbstractBaseUser
)
class UserProfileManager(BaseUserManager):
 def create_user(self, email, name, password=None):
  """
  用戶(hù)創(chuàng)建,需要提供 email、name、password
  """
  if not email:
   raise ValueError('Users must have an email address')
  user = self.model(
   email=self.normalize_email(email),
   name=name,
  )
  user.set_password(password)
  user.save(using=self._db)
  return user
 def create_superuser(self, email, name, password):
  """
  超級(jí)用戶(hù)創(chuàng)建,需要提供 email、name、password
  """
  user = self.create_user(
   email,
   password=password,
   name=name,
  )
  user.is_admin = True
  user.is_active = True
  user.save(using=self._db)
  return user
class UserProfile(AbstractBaseUser):
 # 在此處可以配置更多的自定義字段
 email = models.EmailField(
  verbose_name='email address',
  max_length=255,
  unique=True,
 )
 name = models.CharField(max_length=32, verbose_name="用戶(hù)名稱(chēng)")
 phone = models.IntegerField("電話")
 is_active = models.BooleanField(default=True)
 is_admin = models.BooleanField(default=False)
 objects = UserProfileManager()
 USERNAME_FIELD = 'email' # 將email 作為登入用戶(hù)名
 REQUIRED_FIELDS = ['name', 'phone']
 def __str__(self):
  return self.email
 def get_full_name(self):
  # The user is identified by their email address
  return self.email
 def get_short_name(self):
  # The user is identified by their email address
  return self.email
 def has_perm(self, perm, obj=None):
  "Does the user have a specific permission?"
  # Simplest possible answer: Yes, always
  return True
 def has_module_perms(self, app_label):
  "Does the user have permissions to view the app `app_label`?"
  # Simplest possible answer: Yes, always
  return True
 @property
 def is_staff(self):
  "Is the user a member of staff?"
  # Simplest possible answer: All admins are staff
  return self.is_admin

admin 配置

class UserCreationForm(forms.ModelForm):
 """A form for creating new users. Includes all the required
 fields, plus a repeated password."""
 password1 = forms.CharField(label='Password', widget=forms.PasswordInput)
 password2 = forms.CharField(label='Password confirmation', widget=forms.PasswordInput)

 class Meta:
  model = models.UserProfile
  fields = ('email', 'name')

 def clean_password2(self):
  password1 = self.cleaned_data.get("password1")
  password2 = self.cleaned_data.get("password2")
  if password1 and password2 and password1 != password2:
   raise forms.ValidationError("Passwords don't match")
  return password2

 def save(self, commit=True):
  user = super(UserCreationForm, self).save(commit=False)
  user.set_password(self.cleaned_data["password1"])
  if commit:
   user.save()
  return user


class UserChangeForm(forms.ModelForm):
 """A form for updating users. Includes all the fields on
 the user, but replaces the password field with admin's
 password hash display field.
 """
 password = ReadOnlyPasswordHashField()
 class Meta:
  model = models.UserProfile
  fields = ('email', 'password', 'name', 'is_active', 'is_admin')
 def clean_password(self):
  return self.initial["password"]
class UserProfileAdmin(BaseUserAdmin):
 form = UserChangeForm
 add_form = UserCreationForm
 list_display = ('email', 'name', 'is_admin', 'is_staff')
 list_filter = ('is_admin',)
 fieldsets = (
  (None, {'fields': ('email', 'password')}),
  ('Personal info', {'fields': ('name',)}),
  ('Permissions', {'fields': ('is_admin', 'is_active', 'roles', 'user_permissions', 'groups')}),
 )
 add_fieldsets = (
  (None, {
   'classes': ('wide',),
   'fields': ('email', 'name', 'password1', 'password2')}
   ),
 )
 search_fields = ('email',)
 ordering = ('email',)
 filter_horizontal = ('groups', 'user_permissions','roles')

2.Django允許您通過(guò)AUTH_USER_MODEL配置來(lái)引用自定義的model設(shè)置來(lái)覆蓋默認(rèn)User模型,這個(gè)配置的配置方法為在 settings 中加入:AUTH_USER_MODEL = "APP.model_class" ,例如本例中我們需要在 setting 中加入以下配置:

AUTH_USER_MODEL = "app1.UserProfile"

3.部署

python manage.py makemigrations
python manage.py migrate

創(chuàng)建一個(gè)新用戶(hù),此時(shí)我們就可以用這個(gè)用戶(hù)來(lái)登錄 admin 后臺(tái)了

python manage.py createsuperuser

效果如下:

 

自定義認(rèn)證

那如果我們需要使用我們自己的認(rèn)證系統(tǒng)呢,假如我們有一個(gè) login 頁(yè)面和一個(gè) home 頁(yè)面:

from django.shortcuts import render, HttpResponse, redirect
from django.contrib.auth import authenticate,login,logout
from app1 import models
from django.contrib.auth.decorators import login_required

def auth_required(auth_type):
 # 認(rèn)證裝飾器
 def wapper(func):
  def inner(request, *args, **kwargs):
   if auth_type == 'admin':
    ck = request.COOKIES.get("login") # 獲取當(dāng)前登錄的用戶(hù)
    if request.user.is_authenticated() and ck:
     return func(request, *args, **kwargs)
    else:
     return redirect("/app1/login/")
  return inner
 return wapper

def login_auth(request):
 # 認(rèn)證
 if request.method == "GET":
  return render(request, 'login.html')

 elif request.method == "POST":
  username = request.POST.get('username', None)
  password = request.POST.get('password', None)
  user = authenticate(username=username, password=password)
  if user is not None:
   if user.is_active:
    login(request, user)
    _next = request.GET.get("next",'/crm')
    return redirect('_next')
   else:
    return redirect('/app1/login/')
  else:
   return redirect('/app1/login/')
 else:
  pass
def my_logout(request):
 # 注銷(xiāo)
 if request.method == 'GET':
  logout(request)
  return redirect('/app1/login/')

@login_required
def home(request):
 # home page
 path1, path2 = "Home", '主頁(yè)'
 if request.method == "GET":
  return render(request, 'home.html', locals())
 elif request.method == "POST":
  pass

總結(jié)

以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,如果有疑問(wèn)大家可以留言交流,謝謝大家對(duì)腳本之家的支持。

相關(guān)文章

  • Python?異步如何使用等待有時(shí)間限制協(xié)程

    Python?異步如何使用等待有時(shí)間限制協(xié)程

    這篇文章主要為大家介紹了Python?異步如何使用等待有時(shí)間限制協(xié)程示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-03-03
  • Python3爬蟲(chóng)之urllib攜帶cookie爬取網(wǎng)頁(yè)的方法

    Python3爬蟲(chóng)之urllib攜帶cookie爬取網(wǎng)頁(yè)的方法

    今天小編就為大家分享一篇Python3爬蟲(chóng)之urllib攜帶cookie爬取網(wǎng)頁(yè)的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2018-12-12
  • flask+pymysql實(shí)現(xiàn)Web端操作數(shù)據(jù)庫(kù)的項(xiàng)目實(shí)踐

    flask+pymysql實(shí)現(xiàn)Web端操作數(shù)據(jù)庫(kù)的項(xiàng)目實(shí)踐

    本文主要介紹了flask+pymysql實(shí)現(xiàn)Web端操作數(shù)據(jù)庫(kù)的項(xiàng)目實(shí)踐,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-06-06
  • python 3.0 模擬用戶(hù)登錄功能并實(shí)現(xiàn)三次錯(cuò)誤鎖定

    python 3.0 模擬用戶(hù)登錄功能并實(shí)現(xiàn)三次錯(cuò)誤鎖定

    Python的3.0版本,常被稱(chēng)為Python 3000,或簡(jiǎn)稱(chēng)Py3k。這篇文章主要介紹了python 3.0 模擬用戶(hù)登錄功能并實(shí)現(xiàn)三次錯(cuò)誤鎖定,需要的朋友可以參考下
    2017-11-11
  • python中路徑字符串斜杠替換方式

    python中路徑字符串斜杠替換方式

    這篇文章主要介紹了python中路徑字符串斜杠替換方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-03-03
  • pytorch中torch.topk()函數(shù)的快速理解

    pytorch中torch.topk()函數(shù)的快速理解

    我們?cè)谧龇诸?lèi)算法時(shí),時(shí)常見(jiàn)到@acc1和@acc5的情況,@acc1比較容易實(shí)現(xiàn),但是一直苦于@acc5算法的實(shí)現(xiàn),在此為大家提供一種@topk的實(shí)現(xiàn)方法,這篇文章主要給大家介紹了關(guān)于pytorch中torch.topk()函數(shù)的快速理解,需要的朋友可以參考下
    2022-02-02
  • python基于Opencv實(shí)現(xiàn)人臉口罩檢測(cè)

    python基于Opencv實(shí)現(xiàn)人臉口罩檢測(cè)

    最近嘗試做一個(gè)python基于Opencv實(shí)現(xiàn)人臉口罩檢測(cè),記錄一下過(guò)程,稍微整理精簡(jiǎn)一下做下分享,需要的小伙伴可以參考下
    2021-06-06
  • python腳本當(dāng)作Linux中的服務(wù)啟動(dòng)實(shí)現(xiàn)方法

    python腳本當(dāng)作Linux中的服務(wù)啟動(dòng)實(shí)現(xiàn)方法

    今天小編就為大家分享一篇python腳本當(dāng)作Linux中的服務(wù)啟動(dòng)實(shí)現(xiàn)方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2019-06-06
  • Python requests設(shè)置代理的方法步驟

    Python requests設(shè)置代理的方法步驟

    這篇文章主要介紹了Python requests設(shè)置代理的方法步驟,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-02-02
  • matplotlib中l(wèi)egend位置調(diào)整解析

    matplotlib中l(wèi)egend位置調(diào)整解析

    這篇文章主要介紹了matplotlib中l(wèi)egend位置調(diào)整解析,具有一定借鑒價(jià)值,需要的朋友可以參考下。
    2017-12-12

最新評(píng)論

滨海县| 朔州市| 绥德县| 赫章县| 慈利县| 策勒县| 鹤庆县| 共和县| 尉氏县| 姚安县| 沈阳市| 望江县| 西充县| 嘉黎县| 昌平区| 云和县| 水城县| 龙陵县| 专栏| 昆山市| 松滋市| 沂水县| 广昌县| 民勤县| 藁城市| 札达县| 新竹县| 衡水市| 久治县| 洪江市| 德保县| 石门县| 新郑市| 浦江县| 盐山县| 乐至县| 寿宁县| 互助| 莫力| 即墨市| 金门县|