溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

django裝飾器檢測登錄狀態(tài)操作

發(fā)布時(shí)間:2020-07-03 09:18:27 來源:億速云 閱讀:285 作者:清晨 欄目:開發(fā)技術(shù)

小編給大家分享一下django裝飾器檢測登錄狀態(tài)操作,希望大家閱讀完這篇文章后大所收獲,下面讓我們一起去探討方法吧!

1、檢測登錄狀態(tài)

base.py

def checkLogin(func):
 
  """
  查看session值用來判斷用戶是否已經(jīng)登錄
  :param func:
  :return:
  """
  def warpper(request,*args,**kwargs):
    if request.session.get('username', False):
      return func(request, *args, **kwargs)
 
    else:
      return HttpResponse('/login')
  return warpper

index.py:

from proApp import models, article, base
@base.checkLogin
def index(request):
  dict = {
    "article_list": article.getArticle(),
  }
  return render(request, 'index.html',dict)

1報(bào)錯(cuò):

The view proApp.base.warpper didn't return an HttpResponse object. It returned None instead.

django裝飾器檢測登錄狀態(tài)操作

解決辦法: 判斷用戶session后,一定要return返回值

2、登錄檢查成功,路由未被更改,頁面未跳轉(zhuǎn)

django裝飾器檢測登錄狀態(tài)操作

解決辦法: redirect(‘跳轉(zhuǎn)路徑和名稱‘)方法,頁面跳轉(zhuǎn)

from django.shortcuts import render,render_to_response,redirect
def checkLogin(func):
 
  """
  查看session值用來判斷用戶是否已經(jīng)登錄
  :param func:
  :return:
  """
  def warpper(request,*args,**kwargs):
    if request.session.get('username', False):
      return func(request, *args, **kwargs)

    else:
      return redirect('/login')
  return warpper

注意:render與redirect兩點(diǎn)區(qū)別:

1、render返回一個(gè)登陸成功后的頁面,刷新該頁面將回復(fù)到跳轉(zhuǎn)前頁面。而redirect則不會(huì)

2、render返回一個(gè)登陸成功頁面,不會(huì)經(jīng)過url路由分發(fā)系統(tǒng),也就是說,不會(huì)執(zhí)行跳轉(zhuǎn)后url的試圖函數(shù)。這樣,返回的頁面渲染不成功;而redirect是跳轉(zhuǎn)到指定頁面,當(dāng)?shù)顷懗晒?,?huì)在url路由系統(tǒng)進(jìn)行匹配,如果有存在的映射函數(shù),就會(huì)執(zhí)行對(duì)應(yīng)的映射函數(shù)。

補(bǔ)充知識(shí):Django中的中間件與類視圖

類視圖

函數(shù)視圖:以函數(shù)的方式定義的視圖稱為函數(shù)視圖

類視圖:以類的方式定義的視圖稱為類視圖

代碼可讀性好

類視圖相對(duì)于函數(shù)視圖有更高的復(fù)用性

因此大部分視圖都使用類進(jìn)行封裝。

from django.views import View
class ClassView(View):
  """類視圖的介紹"""

  def get(self, request):
    """get請(qǐng)求方法"""
    print('get請(qǐng)求方法進(jìn)次函數(shù)')
    return HttpResponse('get請(qǐng)求方法')

  def post(self, request):
    """post請(qǐng)求方法進(jìn)此函數(shù)"""
    print('post請(qǐng)求方法')
    return HttpResponse('post請(qǐng)求方法')
  """
 在url中配置
 """
 urlpatterns = [
  url(r"^classview/$", views.ClassView.as_view())
  #ClassView是一個(gè)類 需要調(diào)用Django自帶的as_view方法轉(zhuǎn)換為view

]

中間件

中間件

Django中的中間件是一個(gè)輕量級(jí)、底層的插件系統(tǒng),可以介入Django的請(qǐng)求和響應(yīng)處理過程,修改Django的輸入或輸出。中間件的設(shè)計(jì)為開發(fā)者提供了一種無侵入式的開發(fā)方式,增強(qiáng)了Django框架的健壯性。

我們可以使用中間件,在Django處理視圖的不同階段對(duì)輸入或輸出進(jìn)行干預(yù)。

#先在子應(yīng)用文件下新建(自定義).py文件
# 自定義中間鍵
def outer(fuc):
  print('調(diào)用前')
  def inner(*args, **kwargs):
    print('執(zhí)行前')
    data = fuc(*args, **kwargs)
    print(' 執(zhí)行后')
    return data
  return inner
#2. settings.py的middleware下面加入自定義的中間件
'user1.middlewares.outer' # 自定義中間件

django裝飾器檢測登錄狀態(tài)操作

django裝飾器檢測登錄狀態(tài)操作

django裝飾器檢測登錄狀態(tài)操作

看完了這篇文章,相信你對(duì)django裝飾器檢測登錄狀態(tài)操作有了一定的了解,想了解更多相關(guān)知識(shí),歡迎關(guān)注億速云行業(yè)資訊頻道,感謝各位的閱讀!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請(qǐng)聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI