首頁  >  文章  >  後端開發  >  Django使用者認證系統(二)Web請求中的認證

Django使用者認證系統(二)Web請求中的認證

黄舟
黄舟原創
2016-12-23 17:42:121482瀏覽

在每個Web請求中都提供一個 request.user 屬性來表示目前使用者。如果目前使用者未登錄,則該屬性為AnonymousUser的實例,反之,則為User實例。

你可以透過is_authenticated()來區分,例如:

if request.user.is_authenticated():
   # Do something for authenticated users.
else:
some 對

login()

登陸函數,需要一個HttPRequest物件和一個User物件作為參數。 login()使用django的session框架,將User的id儲存在session中。

同時使用authenticate()和login():

from django.contrib.auth import authenticate, login

def my_view(request):   ​​l. 'password']
   user = authenticate(username=username, password=password)
   if user is not None:
       if        # Redirect to a success page.
       else:
           # Return a 'disabled account' error message
   else:
       # Return an 'invalid login' error message.


退出登入例如:

from django.contrib.auth import logout

def logout_view(request):

   logout(request)

   request.user. is_authenticated() 

再導向:

from django.shortcuts import redirect

def my_view(request):
   if not request.user.is_authenated(cm. =%s' % request.path)
   # ...


或:

from django.shortcuts import render

def my_view(request):

. 'myapp/ login_error.html')

   # ...

使用裝飾器login_required


login_required([redirect_field_name=REDIRECT_FIELD_NAME, login_url=None]din_url=Nopfin.

@login_required
def my_view( request):
   ...

如果用戶未登錄,則重定向到 settings.LOGIN_URL,並將現在的url相對路徑構成一個next做key的查詢字元對附加到 settings.LOGIN_URL後面去:

/ accounts/login/?next=/polls/3/.


query字元對的key預設為next,也可以自己命名:

from django.contrib.auth.decorators import login_requirefrom django.contrib.auth.decorators import login_required
my_redirect_field')

def my_view(request):

   ...

也可以自己定義login_url:


from django.contrib.auth.decorators import login_required

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

urls.py中需定義:


(r'^accounts/login/$', 'django.contrib.auth.views.login'),

測試登入使用者


例如,要偵測使用者的email:

def my_view(request):
   if not '@example.com' in request.user.email:
  ote oo​​l YouRereturn Htt s .")

   # ...

可以用裝飾器:

from django.contrib.auth.decorators import user_passes_test

defimail_check(user): 3turn 🠎 @user_passes_test(email_check)
def my_view(request):

   ...

也可以改變login_url:

@user_passes_test(email_check, login_url’/log@user_passes_test(email_check, login_urls login/片

認證Views

當然,我們可以自己定義一些登陸,登出,密碼管理的view 函數,而且也更加方便。

不過也可以學習下Django內建的views。

Django沒有為認證views提供缺省模板,however the template context is documented for each view below.

所有內建views都傳回一個TemplateResponse實例,可以讓你很方便的客製化response資料。

https://github.com/django/django/blob/master/django/contrib/auth/views.py

多數的內建認證views都提供一個URL名稱以便使用。

login(request[, template_name, redirect_field_name, authentication_form,current_app,extra_context])

原始碼:

def login(request, template_name='registration/login.html',
         redirect_field_name=REDIRECT_FIELD_NAME,
  生活    =無, extra_context=無):
   """
   顯示登入表單並處理登入作業.
""
   redirect_to = request.POST.get(redirect_field_name,
                                          if request.method == "POST":
       表單=authentication_form(請求,資料= request. POST)
       if form.is_valid():

           # 確保使用者啟動的重新導向url是安全的。
            if not is_safe_url(url=redirect_to, host=request.get_host()):
         .         # 好的,安全檢查完成。讓使用者登入。
           auth_login(request, form。 (request)

   current_site = get_current_網站(請求)

   context = {
      'form' :表單,
       redirect_field_name:redirect_to,
      'site':current_site,
      'site_name':current_site.name,
      'site_name':current_site.name,
      'site_name':current_site.name,🠎     context.update(extra_context)
   返回TemplateResponse(請求, template_name, 情境,
           )


URL名稱:login

參數:

template_name:預設登陸的範本。預設為registration/login.html。
redirect_field_name:重定向的名稱,預設為next。
authenti cation_form: 預設形式。預設為 AuthenticationForm。
current_app:指示哪個應用程式包含目前視圖的提示。更多資訊請參閱命名空間 URL 解析策略。
extra_context: 新增到預設上下文資料中的額外數據,為字典。

django.contrib.auth.views.login 的作用:

透過如果GET訪問,將登入顯示表單,可以將其內容POST到相同的URL上。

如果透過POST訪問,它首先會嘗試登錄,如果成功,請查看重定向到下一個指定的連結。如果下一個未設置,則重定向到settings.LOGIN_REDIRECT_URL (一般預設設定accounts/profile/)。如果登入失敗,則再次顯示登入表單。


需要使用者自己提供login的html模板,否則是registration/login.html。這個範本將傳遞4個範本上下文變數:

form: 一個表單物件AuthenticationForm。
next: 登入成功後的重定向鏈接,可以包含一個查詢字串中。

site: 目前網站,依據SITE_ID設定。如果你沒有安裝網站框架,這個變數將會設定為一個RequestSite實例,它從目前HttpRequest中取得網站名稱和網域名稱。

site_name: 是site.name的一個別名。如果你沒有安裝網站框架,它將被設為request.META['SERVER_NAME']

如果你不想呼叫registration/login.html模板,你可以在URLconf中設定特定的視圖參數來傳遞template_name參數。

(r'^accounts/login/$', 'django.contrib. auth.views.login', {'template_name': 'myapp/login.html'}),

你也自己可以指定重定向連結欄位名,透過redirect_field_name參數。預設的欄位名為next.

下面是registration/login.html模板的原始狀態,它假設你有一個base.html模板(其中有內容塊的定義。

{% extends "base.html" %}

{% block content %}

{% if form.errors %}

Your username and password didntry't match. Please

Your username and password didntry't match. Please try again.
{% endif %}


{% csrf_token %}


   
   


   

   

   
   

{{ form.username.label_tag }} {{ form.username }}


{{ form.pass .label_tag }} {{ form.password }}

{% endblock %}

如果自己自訂認證系統,可以透過authentication_form 參數把自自訂定義的認證表單傳給login view。該表單的__init__ 方法應該有一個request 的參數,並提供一個 get_user 方法來傳回認證後的User物件。

logout(request[, next_page, template_name, redirect_field_name, current_app,extra_context])

登出使用者.

URL name: logout 重定向🜎 _login (request[, login_url, current_app, extra_context])

註銷用戶然後重定向到登錄鏈接.

可選參數:

login_url: 登陸頁面的重定向鏈接,缺省值為settings.LOGIN_URL。

password_change(request[, template_name, post_change_redirect,password_change_form,current_app, extra_context])

允許使用者修改密碼為registration/password_change_form.html 。

post_change_redirect: 重定向連結。

password_change_form: 自訂的密碼修改表單,包含一個user 參數。缺省值為PasswordChangeForm.

password_change_done(request[, template_name,current_app, extra_context])


用戶修改密碼後的頁面.

URL name: password_change_done

可選參數Optional arguments:

template_name: 模板名稱,預設為registration/password_change_done.html.

password_reset(request[, is_admin_site, template_name, email_template_name, password_reset_form, token_generator, post_reset_redirect, from_app, curtras_mail_iv)向用戶發送郵件,內含一次性鏈接,來讓使用者重設密碼。

如果提供的郵箱不存在,則不會發送。

URL name: password_reset

可選參數 Optional arguments:

template_name: 範本名稱,缺省值為registration/password_reset_form.html。

email_template_name: 用來產生具有儲值連結email的範本名稱,缺省值為registration/password_reset_email.html。

subject_template_name: 用來產生郵件主題的範本名稱,缺省值為 registration/password_reset_subject.txt。

password_reset_form: 重設密碼的表單,缺省值為PasswordResetForm.

token_generator: 檢查一次性連結的類別實例,缺省值為default_token_generator, 其類別為django.contrib.a.tokens.Gen.密碼重設後的重新導向連結.

from_email: 郵件地址,缺省值為DEFAULT_FROM_EMAIL.


current_app: A hint indicating which application contains the current view. See the namespaced responution A dictionary of context data that will be added to the default context data passed to the template.

html_email_template_name: The full name of a template to use for generating a text/html multipart email with the password reset link. not sent.

範例: registration/password_reset_email.html (email內容範本):

Someone asked for password reset for email {{ email }}. Follow the link below:

{{ proto }}{% url 'password_reset_confirm' uidb64=uid token=token %}

password_reset_done(request[, template_name])

顯示使用者選擇發送密碼重設郵件後的頁面。如果 password_reset() view中沒有明確指定post_reset_redirect連結時,則直接呼叫本view。

password_reset_confirm(request[, uidb36, token, template_name, token_generator,set_password_form, post_reset_redirect,current_app, extra_context])

_app, extra_context])

重置密碼成功後的表單。

Helper functions

redirect_to_login(next[, login_url, redirect_field_name])

重定向到登入頁面,登入成功後的在重定向到另一個連結。 .

參數:

next: 登入成功後的鏈接.

login_url: 登陸頁面鏈接,預設缺省值:settings.LOGIN_URL。

redirect_field_name: 重定向欄位名稱,缺省值為next。

內建表單 Built-in forms

class AdminPasswordChangeForm

admin後台的使用者密碼修改表單

class AuthenticationForm

登入表單。

方法confirm_login_allowed(user)

例如,允許所有的users登陸,不管is_active屬性:

from django.contrib.auth.forms import Authentication in_allowed(self, user):
       pass


或只允許活躍使用者登陸:

class PickyAuthenticationForm(AuthenticationForm):

   def confirm_login_allowed(self,user):           raise forms.ValidationError(

               _("This account is inactive ."),

               code='inactive',
           )
   ValidationError(
               _("Sorry, accounts starting with 'b' aren't welcome here. "),
               code='no_b_users',
           )

set
class PasswordChanFormge .

class SetPasswordForm

密碼設定表單.

class UserChangeForm

admin後台的使用者資訊和權限修改表單.

class UserCreationForm

使用者建立表單.

範本中的認證資訊Authentication data in templates

目前登入使用者及其權限可以在範本變數中取得權限,透過使用RequestContext.

Users

在渲染模板RequestContext時,目前的登入使用者無論是User實例或AnonymousUser 實例皆保存在範本變數{{ user }}:

{% if user.is_authenticated %}

 

{% if user.is_authenticated %}

 

{ user.username }}. Thanks for logging in.

{% else %}

   

Welcome, new user. Please log in.

{% endif %}


如果未使用RequestContext,則此變數不存在。


使用RequestContext:

from django.shortcuts import render_to_response
from django.template import RequestContext

def some_view(request):🠎_mymmo

.

                             my_data_dictionary,

        (request))


  

 以上就是Django用戶認證系統(二)Web請求中的認證的內容,更多相關內容請關注PHP中文網(www.php.cn)!




陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn