在每個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):
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')
...
也可以自己定義login_url:
from django.contrib.auth.decorators import login_required
@login_required(login_url='/accounts/login/')
def my_view(request):
...
(r'^accounts/login/$', 'django.contrib.auth.views.login'),
例如,要偵測使用者的email:
def my_view(request):
if not '@example.com' in request.user.email:
ote ool 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:
認證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_name: 是site.name的一個別名。如果你沒有安裝網站框架,它將被設為request.META['SERVER_NAME']
如果你不想呼叫registration/login.html模板,你可以在URLconf中設定特定的視圖參數來傳遞template_name參數。
你也自己可以指定重定向連結欄位名,透過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 %}
{% 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])
用戶修改密碼後的頁面.
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.
{{ 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
或只允許活躍使用者登陸:
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:
from django.shortcuts import render_to_response
from django.template import RequestContext
.
my_data_dictionary,(request))
以上就是Django用戶認證系統(二)Web請求中的認證的內容,更多相關內容請關注PHP中文網(www.php.cn)!