欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

django認(rèn)證系統(tǒng) Authentication使用詳解

 更新時(shí)間:2019年07月22日 15:00:08   作者:NAVYSUMMER  
這篇文章主要介紹了django認(rèn)證系統(tǒng) Authentication使用詳解,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下

前言

Django自帶一個(gè)用戶認(rèn)證系統(tǒng),用于處理用戶賬戶、群組、許可和基于cookie的用戶會(huì)話。

Django的認(rèn)證系統(tǒng)包含了身份驗(yàn)證和權(quán)限管理兩部分。簡(jiǎn)單地說,身份驗(yàn)證用于核實(shí)某個(gè)用戶是否合法,權(quán)限管理則是決定一個(gè)合法用戶具有哪些權(quán)限。往后,‘認(rèn)證'這個(gè)詞同時(shí)代指上面兩部分的含義。

Django的認(rèn)證系統(tǒng)主要包括下面幾個(gè)部分:

  • 用戶
  • 許可
  • 可配置的密碼哈希系統(tǒng)
  • 用于用戶登錄或者限制訪問的表單和視圖工具
  • 可插拔的后臺(tái)系統(tǒng)

類似下面的問題,不是Django認(rèn)證系統(tǒng)的業(yè)務(wù)范圍,請(qǐng)使用第三方工具:

  • 密碼強(qiáng)度檢查
  • 登錄請(qǐng)求限制
  • 第三方認(rèn)證

默認(rèn)情況下,使用django-admin startproject命令后,認(rèn)證相關(guān)的模塊已經(jīng)自動(dòng)添加到settings文件內(nèi)了,如果沒有的話,請(qǐng)手動(dòng)添加。

在INSTALLED_APPS配置項(xiàng)中添加:

  • 'django.contrib.auth': 包含認(rèn)證框架的核心以及默認(rèn)模型
  • 'django.contrib.contenttypes':內(nèi)容類型系統(tǒng),用于給模型關(guān)聯(lián)許可

在MIDDLEWARE配置項(xiàng)中添加:

  • SessionMiddleware:通過請(qǐng)求管理會(huì)話
  • AuthenticationMiddleware:將會(huì)話和用戶關(guān)聯(lián)

當(dāng)配置正確后,運(yùn)行manage.py migrate命令,創(chuàng)建用戶認(rèn)證系統(tǒng)相關(guān)的數(shù)據(jù)庫(kù)表以及分配預(yù)定義的權(quán)限。

一、用戶對(duì)象

用戶對(duì)象是Django認(rèn)證系統(tǒng)的核心!在Django的認(rèn)證框架中只有一個(gè)用戶模型也就是User模型,它位于django.contrib.auth.models。

本節(jié)內(nèi)容敘述的所有功能,都是基于這個(gè)User模型的,和這個(gè)User模型沒有任何關(guān)系的自定義用戶模型是無法使用Django認(rèn)證系統(tǒng)的功能的!

用戶模型主要有下面幾個(gè)字段:

  • username
  • password
  • email
  • first_name
  • last_name

1. 創(chuàng)建用戶

要?jiǎng)?chuàng)建一個(gè)新用戶,最直接的辦法是使用create_user()方法:

>>> from django.contrib.auth.models import User
>>> user = User.objects.create_user('john', 'lennon@thebeatles.com', 'johnpassword')
# 這時(shí),user是一個(gè)User類的實(shí)例,已經(jīng)保存在了數(shù)據(jù)庫(kù)內(nèi),你可以隨時(shí)修改它的屬性,例如:
>>> user.last_name = 'Lennon'
>>> user.save()

如果你已經(jīng)啟用了Django的admin站點(diǎn),你也可以在后臺(tái)創(chuàng)建用戶。

2. 創(chuàng)建超級(jí)用戶

使用createsuperuser命令,創(chuàng)建超級(jí)用戶:

$ python manage.py createsuperuser

或者

$ python manage.py createsuperuser --username=joe --email=joe@example.com

根據(jù)提示輸入名字、密碼和郵箱地址。密碼要有一定強(qiáng)度

3. 修改密碼

Django默認(rèn)會(huì)對(duì)密碼進(jìn)行加密,因此,不要企圖對(duì)密碼進(jìn)行直接操作。

要修改密碼,有兩個(gè)辦法:

  • 使用命令行: python manage.py changepassword username。如果不提供用戶名,則會(huì)嘗試修改當(dāng)前系統(tǒng)用戶的密碼。
  • 使用set_password()方法:
from django.contrib.auth.models import User
u = User.objects.get(username='john')
u.set_password('new password')
u.save()

同樣可以在admin中修改密碼。Django提供了views和forms,方便用戶自己修改密碼。 修改密碼后,用戶的所有當(dāng)前會(huì)話將被注銷。

4. 用戶驗(yàn)證

利用authenticate()方法,對(duì)用戶進(jìn)行驗(yàn)證。該方法通常接收username與password作為參數(shù)。要注意的是,認(rèn)證的后端可能有好幾個(gè),有一項(xiàng)認(rèn)證通過則返回一個(gè)User類對(duì)象,一項(xiàng)都沒通過或者拋出了PermissionDenied異常,則返回一個(gè)None。例如:

from django.contrib.auth import authenticate
user = authenticate(username='john', password='secret')
if user is not None:
  # A backend authenticated the credentials
else:
  # No backend authenticated the credentials

二、 權(quán)限與授權(quán)

Django提供了一個(gè)簡(jiǎn)單的權(quán)限系統(tǒng),并且已經(jīng)用于它的admin站點(diǎn),當(dāng)然你也可以在你的代碼中使用。

User模型的對(duì)象有兩個(gè)多對(duì)多的字段:groups和user_permissions,可以像下面這樣訪問他們:

myuser.groups.set([group_list])
myuser.groups.add(group, group, ...)
myuser.groups.remove(group, group, ...)
myuser.groups.clear()
myuser.user_permissions.set([permission_list])
myuser.user_permissions.add(permission, permission, ...)
myuser.user_permissions.remove(permission, permission, ...)
myuser.user_permissions.clear()

1. 默認(rèn)權(quán)限

默認(rèn)情況下,使用manage.py migrate命令時(shí),Django會(huì)給每個(gè)已經(jīng)存在的model添加默認(rèn)的權(quán)限。 假設(shè)你現(xiàn)在有個(gè)app叫做foo,有個(gè)model叫做bar,使用下面的方式可以測(cè)試默認(rèn)權(quán)限:

add: user.has_perm('foo.add_bar')
change: user.has_perm('foo.change_bar')
delete: user.has_perm('foo.delete_bar')

2. 用戶組

Django提供了一個(gè)django.contrib.auth.models.Group模型,該model可用于給用戶分組,實(shí)現(xiàn)批量管理。用戶和組屬于多對(duì)多的關(guān)系。用戶自動(dòng)具有所屬組的所有權(quán)限。

3. 在代碼中創(chuàng)建權(quán)限

例如,為myapp中的BlogPost模型添加一個(gè)can_publish權(quán)限。

from myapp.models import BlogPost
from django.contrib.auth.models import Permission
from django.contrib.contenttypes.models import ContentType

content_type = ContentType.objects.get_for_model(BlogPost)
permission = Permission.objects.create(
  codename='can_publish',
  name='Can Publish Posts',
  content_type=content_type,
)

然后,你可以通過User模型的user_permissions屬性或者Group模型的permissions屬性為用戶添加該權(quán)限。

4. 權(quán)限緩存

權(quán)限檢查后,會(huì)被緩存在用戶對(duì)象中。參考下面的例子:

from django.contrib.auth.models import Permission, User
from django.shortcuts import get_object_or_404

def user_gains_perms(request, user_id):
  user = get_object_or_404(User, pk=user_id)
  # any permission check will cache the current set of permissions
  user.has_perm('myapp.change_bar')

  permission = Permission.objects.get(codename='change_bar')
  user.user_permissions.add(permission)

  # Checking the cached permission set
  user.has_perm('myapp.change_bar') # False

  # Request new instance of User
  # Be aware that user.refresh_from_db() won't clear the cache.
  user = get_object_or_404(User, pk=user_id)

  # Permission cache is repopulated from the database
  user.has_perm('myapp.change_bar') # True

  ...

三、 在視圖中認(rèn)證用戶

Django使用session和中間件關(guān)聯(lián)請(qǐng)求對(duì)象中和認(rèn)證系統(tǒng)。

每一次請(qǐng)求中都包含一個(gè)request.user屬性,表示當(dāng)前用戶。如果該用戶未登陸,該屬性的值是一個(gè)AnonymousUser實(shí)例(匿名用戶),如果已經(jīng)登錄,該屬性就是一個(gè)User模型的實(shí)例。

可以使用is_authenticated方法進(jìn)行判斷,如下:

if request.user.is_authenticated:
# Do something for authenticated users.
...
else:
  # Do something for anonymous users.
  ...

1. 如何登錄用戶

在視圖中,使用認(rèn)證系統(tǒng)的login()方法登錄用戶。它接收一個(gè)HttpRequest參數(shù)和一個(gè)User對(duì)象參數(shù)。該方法會(huì)把用戶的ID保存在Django的session中。下面是一個(gè)認(rèn)證和登陸的例子:

from django.contrib.auth import authenticate, login

def my_view(request):
  username = request.POST['username']
  password = request.POST['password']
  user = authenticate(username=username, password=password)
  if user is not None:
    login(request, user)
    # 跳轉(zhuǎn)到成功頁(yè)面
    ...
  else:
    # 返回一個(gè)非法登錄的錯(cuò)誤頁(yè)面
    ...

2. 如何注銷用戶

logout(request)[source]:

from django.contrib.auth import logout

def logout_view(request):
  logout(request)
  # Redirect to a success page.

注意,被logout的用戶如何沒登錄,不會(huì)拋出錯(cuò)誤。 一旦logout,當(dāng)前請(qǐng)求中的session數(shù)據(jù)都會(huì)被清空。

3. 限制用戶的訪問權(quán)限

很多時(shí)候,我們要區(qū)分已登錄用戶和未登錄用戶,只對(duì)登錄的用戶開放一些頁(yè)面或功能,限制未登錄用戶的行為。辦法有很多,下面是主要幾種:

1.原始的辦法:

如果用戶未登錄,重定向到登錄頁(yè)面,如下所示:

from django.conf import settings
from django.shortcuts import redirect

def my_view(request):
  if not request.user.is_authenticated:
    return redirect('%s?next=%s' % (settings.LOGIN_URL, request.path))
  # ...

或者顯示一個(gè)錯(cuò)誤信息:

from django.shortcuts import render

def my_view(request):
  if not request.user.is_authenticated:
    return render(request, 'myapp/login_error.html')
  # ...

2. 使用裝飾器

原型:login_required(redirect_field_name='next', login_url=None)[source]

被該裝飾器裝飾的視圖,強(qiáng)制要求用戶必須登錄后才可以訪問。

from django.contrib.auth.decorators import login_required

@login_required
def my_view(request):
  ...

該裝飾器工作機(jī)制:

  • 如果用戶未登陸,重定向到settings.LOGIN_URL,傳遞當(dāng)前絕對(duì)路徑作為url字符串的參數(shù),例如:/accounts/login/?next=/polls/3/
  • 如果用戶已經(jīng)登錄,執(zhí)行正常的視圖

此時(shí),默認(rèn)的url中使用的參數(shù)是“next”,如果你想使用自定義的參數(shù),請(qǐng)修改login_required()的redirect_field_name參數(shù),如下所示:

from django.contrib.auth.decorators import login_required

@login_required(redirect_field_name='my_redirect_field')
def my_view(request):
  ...

如果你這么做了,你還需要重新定制登錄模板,因?yàn)樗昧藃edirect_field_name變量。

login_required()裝飾器還有一個(gè)可選的longin_url參數(shù)。例如:

from django.contrib.auth.decorators import login_required

@login_required(login_url='/accounts/login/')
def my_view(request):
  ...

注意:如果不指定login_url參數(shù),請(qǐng)確保你的settings.LOGIN_URL和登陸視圖保持正確的關(guān)聯(lián)。例如:

from django.contrib.auth import views as auth_views
url(r'^accounts/login/$', auth_views.login),

3. 使用LoginRequired mixin

通過繼承LoginRequiredMixin類的方式限制用戶。在多繼承時(shí),該類必須是最左邊的父類。

from django.contrib.auth.mixins import LoginRequiredMixin

class MyView(LoginRequiredMixin, View):
  login_url = '/login/'
  redirect_field_name = 'redirect_to'

4. 進(jìn)行測(cè)試,根據(jù)結(jié)果決定動(dòng)作

也可以直接在視圖中進(jìn)行過濾:

from django.shortcuts import redirect

def my_view(request):
  if not request.user.email.endswith('@example.com'):
    return redirect('/login/?next=%s' % request.path)
  # ...

上面根據(jù)用戶的郵箱地址,判斷用戶的權(quán)限。

5. 使用權(quán)限需求裝飾器

Django內(nèi)置了一個(gè)permission_required()裝飾器,用戶根據(jù)用戶權(quán)限,決定視圖的訪問權(quán)限,如下所示:

from django.contrib.auth.decorators import permission_required

@permission_required('polls.can_vote')
def my_view(request):
  ...

權(quán)限的格式是<app label>.<permission codename>。

該裝飾器還有一個(gè)可選的longin_url參數(shù):

from django.contrib.auth.decorators import permission_required

@permission_required('polls.can_vote', login_url='/loginpage/')
def my_view(request):
  ...

4. 認(rèn)證視圖

Django為我們提供了一系列認(rèn)證相關(guān)的視圖,可以直接拿來用,這樣你就不需要自己寫登錄、注銷、注冊(cè)等視圖。但是,但是,Django沒有為認(rèn)證視圖提供默認(rèn)的模板,你需要自己寫......。

所以,除非懶癌發(fā)作,還是老老實(shí)實(shí)自己寫認(rèn)證相關(guān)的視圖、路由和模板吧。個(gè)人認(rèn)為類似跟實(shí)際生產(chǎn)環(huán)境結(jié)合非常緊密的視圖,根本不需要這種雞肋的內(nèi)置視圖,到最后,你發(fā)現(xiàn)還是要自己寫才能滿足需求。

所以,后面的部分就不贅述了!

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • Python?文件與文件對(duì)象及文件打開關(guān)閉

    Python?文件與文件對(duì)象及文件打開關(guān)閉

    這篇文章主要介紹了Python?中的文件與文件對(duì)象,Python中常有的數(shù)據(jù)文件類型有文本文件、二進(jìn)制文件和CSV文件,文本文件是ASCII編碼,漢子存儲(chǔ)的是機(jī)內(nèi)碼,更多詳細(xì)內(nèi)容,需要的小伙伴可以參考一下
    2022-03-03
  • Django1.7+python 2.78+pycharm配置mysql數(shù)據(jù)庫(kù)教程

    Django1.7+python 2.78+pycharm配置mysql數(shù)據(jù)庫(kù)教程

    原本感覺在Django1.7+python 2.78+pycharm環(huán)境下配置mysql數(shù)據(jù)庫(kù)是件很容易的事情,結(jié)果具體操作的時(shí)候才發(fā)現(xiàn),問題還是挺多的,這里記錄一下最終的配置結(jié)果,給需要的小伙伴參考下吧
    2014-11-11
  • Selenium+BeautifulSoup+json獲取Script標(biāo)簽內(nèi)的json數(shù)據(jù)

    Selenium+BeautifulSoup+json獲取Script標(biāo)簽內(nèi)的json數(shù)據(jù)

    這篇文章主要介紹了Selenium+BeautifulSoup+json獲取Script標(biāo)簽內(nèi)的json數(shù)據(jù),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-12-12
  • python學(xué)習(xí)之matplotlib繪制散點(diǎn)圖實(shí)例

    python學(xué)習(xí)之matplotlib繪制散點(diǎn)圖實(shí)例

    這篇文章主要介紹了python學(xué)習(xí)之matplotlib繪制散點(diǎn)圖實(shí)例,具有一定借鑒價(jià)值,需要的朋友可以參考下。
    2017-12-12
  • Appium+python+unittest搭建UI自動(dòng)化框架的實(shí)現(xiàn)

    Appium+python+unittest搭建UI自動(dòng)化框架的實(shí)現(xiàn)

    本文主要介紹了Appium+python+unittest搭建UI自動(dòng)化框架的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2024-03-03
  • C#中使用XPath定位HTML中的img標(biāo)簽的操作示例

    C#中使用XPath定位HTML中的img標(biāo)簽的操作示例

    隨著互聯(lián)網(wǎng)內(nèi)容的日益豐富,網(wǎng)頁(yè)數(shù)據(jù)的自動(dòng)化處理變得愈發(fā)重要,圖片作為網(wǎng)頁(yè)中的重要組成部分,其獲取和處理在許多應(yīng)用場(chǎng)景中都顯得至關(guān)重要,本文將詳細(xì)介紹如何在 C# 應(yīng)用程序中使用 XPath 定位 HTML 中的 img 標(biāo)簽,并實(shí)現(xiàn)圖片的下載,需要的朋友可以參考下
    2024-07-07
  • python 實(shí)現(xiàn)的IP 存活掃描腳本

    python 實(shí)現(xiàn)的IP 存活掃描腳本

    這篇文章主要介紹了python 實(shí)現(xiàn)的IP 存活掃描腳本,幫助大家更好的理解和使用python,感興趣的朋友可以了解下
    2020-12-12
  • 使用python將時(shí)間轉(zhuǎn)換為指定的格式方法

    使用python將時(shí)間轉(zhuǎn)換為指定的格式方法

    今天小編就為大家分享一篇使用python將時(shí)間轉(zhuǎn)換為指定的格式方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2018-11-11
  • Python學(xué)習(xí)教程之常用的內(nèi)置函數(shù)大全

    Python學(xué)習(xí)教程之常用的內(nèi)置函數(shù)大全

    python給我們提供了很多已經(jīng)定義好的函數(shù),下面這篇文章主要給大家介紹了關(guān)于Python學(xué)習(xí)教程之一些常用的內(nèi)置函數(shù),文中分享了關(guān)于數(shù)學(xué)函數(shù)、功能函數(shù)、類型轉(zhuǎn)換函數(shù)、字符串處理和序列處理函數(shù)的相關(guān)資料,需要的朋友可以參考借鑒,下面來一起看看吧。
    2017-07-07
  • Python處理EXCEL表格導(dǎo)入操作分步講解

    Python處理EXCEL表格導(dǎo)入操作分步講解

    python操作excel主要用到xlrd和pandas兩個(gè)庫(kù),xlrd讀取表格數(shù)據(jù),支持xlsx和xls格式的excel表格,文章圍繞主題展開詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的朋友可以參考一下
    2022-08-08

最新評(píng)論