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

django限制匿名用戶訪問及重定向的方法實例

 更新時間:2018年02月07日 08:40:06   作者:__奇犽犽  
這篇文章主要給大家介紹了關于django限制匿名用戶訪問及重定向的相關資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧。

前言

大家應該都遇到過,在某些頁面中,我們不希望匿名用戶能夠訪問,例如個人頁面等,這種頁面只允許已經登錄的用戶去訪問,在django中,我們也有比較多的方式去實現(xiàn)。

最簡單的,我們在viewz中去判斷用戶is_authenticated,但這種方法也相對比較笨拙,最理想的的我們當然不希望這個請求能夠進入到我們view,在這之前就能夠返回一個相關的response,而django其實已經給我們封裝好了相關的函數(shù)與類。下面話不多說了,來一起看看詳細的介紹吧。

基于fbv模式的login_required裝飾器

def login_required(function=None, redirect_field_name=REDIRECT_FIELD_NAME, 
   login_url=None):
 # 實際上這個方法也是調用is_authenticated去判斷
 pass

使用方法也很簡單:

# fbv模式
from django.contrib.auth.decorators import login_required
@login_required 
def user_info_view(request):
 # 用戶個人界面
 pass

那么,我們希望如果是匿名用戶在訪問這個界面后能夠重定向到login界面,我們可以設置相關參數(shù),login_required裝飾器會默認去讀取settings.LOGIN_URL,并重定向到這個頁面,如果希望更為靈活,那么我們也可以給裝飾器傳相關參數(shù)。

# fbv模式
@login_required(login_url='/login/', redirect_field_name='next')
def user_info_view(request):
 # 用戶個人界面
 pass

login_url就是匿名用戶訪問后重定向的url,一般都是login的頁面

redirect_field_name是一個get請求的參數(shù)

假設當前頁面會/user/info/

那么重定向的url為: /login/?next=/user/info/

這個參數(shù)可以用于登陸后直接跳轉回這個頁面,后面還會具體介紹!

基于cbv的LoginRequiredMixin類

博主一般常用都是cbv模式,在這個模式下,我們會重寫get和post方法,理論上可以用login_required裝飾器去裝飾這兩個方法

# cbv模式
from django.contrib.auth.decorators import login_required
from django.utils.decorators import method_decorator
class UserInfoView(View):
 @method_decorator(login_required(login_url='/login/', redirect_field_name='next'))
 def get(self, request):
 # 獲取用戶個人界面
  pass

login_required是函數(shù)裝飾器,method_decorator可以將函數(shù)裝飾器轉化成方法裝飾器。如果這里還有post請求,那這樣的代碼我們還要在寫一遍,這樣就顯得有點冗余,我們既然用了類來實現(xiàn),當然通過類的優(yōu)勢來實現(xiàn)!繼承LoginRequiredMixin!

from django.contrib.auth.mixins import LoginRequiredMixin
class UserInfoView(LoginRequiredMixin, View):
 def get(self, request):
 # 獲取用戶個人界面
  pass

那么,LoginRequiredMixin是怎么去實現(xiàn)的呢?

看看源代碼

class LoginRequiredMixin(AccessMixin):
 def dispatch(self, request, *args, **kwargs):
  if not request.user.is_authenticated():
   return self.handle_no_permission()
  return super(LoginRequiredMixin, self).dispatch(request, *args, **kwargs)

其實它重寫了dispatch方法,因為我們還繼承了view,其實它重寫的view中的dispatch函數(shù),如果知道view的邏輯,你就知道為什么能夠這樣實現(xiàn)了!

當我們在url中,調用你的view類,如UserInfoView.as_view()方法,它會去調用dispatch() ,這個方法起到一個分配器的作用,如果get請求,那么他就調用get方法,如果是post請求,那么就調用post方法。那么,在dispatch中去判斷用戶是否登錄,當然可以起到這個作用。

那既然只是重寫dispatch,我們也可以自己實現(xiàn)!

# 自定義LoginRequiredMixin
class LoginRequiredMixin(object):

 @method_decorator(login_required(login_url='/login/', redirect_field_name='next'))
 def dispatch(self, request, *args, **kwargs):
  return super(LoginRequiredMixin, self).dispatch(request, *args, **kwargs)

當然,有沒有必要自己實現(xiàn),那就看各自的需求啦~

重定向與跳轉

(login_url='/login/', redirect_field_name='next')

這兩個參數(shù)提供了一個重定向與跳轉的url給我們,當匿名用戶登錄需要登錄的頁面時,就會跳轉到login_url,這個get請求還帶著redirect_field_name參數(shù),值是'next'。

假如他訪問的是個人頁面,那么跳轉到

http://127.0.0.1/login/?next=/user/info/

我們可以通過這個參數(shù),在登錄后直接跳轉到個人頁面。

class LoginView(View):
 """
 用戶登錄邏輯
 """
 def get(self, request):
  # 獲取到next參數(shù),渲染到template中,在form表單添加一個hidden類型的元素
  next = request.GET.get('next', '')
  return render(request, "login.html", {'next': next})

 def post(self, request):
  login_form = LoginForm(request.POST)
  if login_form.is_valid():
   user_name = request.POST.get("username", "")
   pass_word = request.POST.get("password", "")
   next = request.POST.get('next', '')
   user = authenticate(username=user_name, password=pass_word)
   if user is not None:
    if user.is_active:
     login(request, user)
     if next:
     # 如果next存在,直接跳轉到指定頁面
      return HttpResponseRedirect(next)
     # 不存在跳轉到index界面
     return HttpResponseRedirect(reverse('index'))
    else:
     return render(request, "login.html", {"msg": "用戶未激活"})
   else:
     return render(request, "login.html", {"msg": "用戶名或密碼錯誤"})
  else:
   return render(request, "login.html", {"login_form": login_form})
# login.html template form中添加
<input name="next" type="hidden" value="{{ next }}"/>

普通頁面的登錄跳轉問題

如果普通頁面也想要實現(xiàn)登錄后跳轉回原來的頁面,十分簡單,在request中有個path參數(shù),它表示當前頁面,我們只需要在跳轉到login界面把這個參數(shù)帶上即可

# template
<a class="loginbtn" href="/login/?next={{ request.path }}" rel="external nofollow" >登錄</a>
<a class='logoutbtn' href="/logout/?next={{ request.path }}" rel="external nofollow" 退出</a>
<a class='registerbtn' href="/register/?next={{ request.path }}" rel="external nofollow" 注冊</a>

login的實現(xiàn)邏輯同上面的一樣,其實logout和注冊界面的實現(xiàn)邏輯也是一樣的。

# logout
class LogoutView(View):
 def get(self, request):
  next = request.GET.get('next', '')
  logout(request)
  try:
   return HttpResponseRedirect(next)
  except:
   return HttpResponseRedirect(reverse('index'))

后言

本篇重點在于@login_required裝飾器的使用,以及LoginReqiredMixin類的使用和自定義,最后實現(xiàn)登錄的重定向以及跳轉!

總結

以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,如果有疑問大家可以留言交流,謝謝大家對腳本之家的支持。

相關文章

  • django 2.0更新的10條注意事項總結

    django 2.0更新的10條注意事項總結

    Django 是 Python Web 開發(fā)最常用的框架之一,跟進它的最新變化絕對是必須的。下面這篇文章主要給大家介紹了關于django 2.0更新的10條注意事項,文中通過示例代碼介紹的非常詳細,需要的朋友可以參考借鑒,下面來一起看看吧。
    2018-01-01
  • Python實現(xiàn)快速多線程ping的方法

    Python實現(xiàn)快速多線程ping的方法

    這篇文章主要介紹了Python實現(xiàn)快速多線程ping的方法,實例分析了Python多線程及ICMP數(shù)據(jù)包的發(fā)送技巧,具有一定參考借鑒價值,需要的朋友可以參考下
    2015-07-07
  • 解決Jupyter Notebook “signal only works in main thread“問題

    解決Jupyter Notebook “signal only works&nb

    這篇文章主要介紹了解決Jupyter Notebook “signal only works in main thread“問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-01-01
  • conda虛擬環(huán)境默認路徑的修改方法

    conda虛擬環(huán)境默認路徑的修改方法

    最近發(fā)現(xiàn)我linux系統(tǒng)中的/dev/root目錄利用率占用了100%,這對后面文件的操作帶來了一些麻煩,下面這篇文章主要給大家介紹了關于conda虛擬環(huán)境默認路徑的修改方法,需要的朋友可以參考下
    2022-07-07
  • Django展示可視化圖表的多種方式

    Django展示可視化圖表的多種方式

    這篇文章主要介紹了Django展示可視化圖表的多種方式,幫助大家更好的理解和學習使用django框架,感興趣的朋友可以了解下
    2021-04-04
  • Python輕量級Web框架之Flask用法詳解

    Python輕量級Web框架之Flask用法詳解

    Flask是一個用Python編寫的輕量級Web應用框架,由于其“微”性質,Flask在提供核心服務的同時,仍然提供了許多擴展的可能性,在這篇文章中,我們將從最基礎開始,學習如何使用Flask構建一個Web應用,需要的朋友可以參考下
    2023-08-08
  • python實現(xiàn)簡單聊天功能

    python實現(xiàn)簡單聊天功能

    這篇文章主要為大家詳細介紹了python實現(xiàn)簡單聊天功能,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-07-07
  • 遍歷python字典幾種方法總結(推薦)

    遍歷python字典幾種方法總結(推薦)

    下面小編就為大家?guī)硪黄闅vpython字典幾種方法總結(推薦)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2016-09-09
  • Flask?web上傳獲取圖像Image讀取并使用方式

    Flask?web上傳獲取圖像Image讀取并使用方式

    這篇文章主要介紹了Flask?web上傳獲取圖像Image讀取并使用方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-11-11
  • Python實現(xiàn)變聲器功能(蘿莉音御姐音)

    Python實現(xiàn)變聲器功能(蘿莉音御姐音)

    這篇文章主要介紹了Python實現(xiàn)變聲器功能(蘿莉音御姐音),本文圖文實例代碼相結合給大家介紹的非常詳細,具有一定的參考借鑒價值,需要的朋友可以參考下
    2019-12-12

最新評論