最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

詳解Django中六個常用的自定義裝飾器

 更新時間:2018年07月04日 08:35:38   作者:j_hao104  
這篇文章主要介紹了詳解Django中六個常用的自定義裝飾器,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧

裝飾器作用

decorator是當今最流行的設計模式之一,很多使用它的人并不知道它是一種設計模式。這種模式有什么特別之處? 有興趣可以看看Python Wiki上例子,使用它可以很方便地修改對象行為,通過使用類似例中的接口將修改動作封裝在裝飾對象中。

decorator 可以動態(tài)地修改函數(shù)、方法或類的功能,而無需創(chuàng)建子類或修改類的源代碼。正因為如此,裝飾器可以讓代碼將變得更干凈、更可讀、更可維護(這很重要!),并且減少了許多冗余但又不得不寫的代碼,使我們可以使用單個方法向多個類添加功能。

對于裝飾器的重用性和易用性,Django里面的@login_required就是一個很好的例子。使用它只用一句代碼就可以檢查用戶是否通過身份驗證,并將未登錄用戶重定向到登錄url。

該裝飾器的使用方法如下:

from django.contrib.auth.decorators import login_required

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

每次用戶試圖訪問 my_view 時,都會進入 login_required 中的代碼。

Django裝飾器

下面介紹一些個人認為比較有用的,或者是之前使用過的具有積極效果的裝飾器。事先聲明,如要實現(xiàn)同樣的業(yè)務場景,并不是只有本文中的方法。Django可以實現(xiàn)各種各樣的裝飾器,這完全根據(jù)您的需要進行定制。

Group Required

有時需要保護一些視圖,只允許某些用戶組訪問。這時就可以使用下面的裝飾器來檢查用戶是否屬于該用戶組。

from django.contrib.auth.decorators import user_passes_test

def group_required(*group_names):
  """Requires user membership in at least one of the groups passed in."""

  def in_groups(u):
    if u.is_authenticated():
      if bool(u.groups.filter(name__in=group_names)) | u.is_superuser:
        return True
    return False
  return user_passes_test(in_groups)


# The way to use this decorator is:
@group_required('admins', 'seller')
def my_view(request, pk):
  ...

有關此裝飾器更多的介紹,可以參考這里。

Anonymous required

這個裝飾器是參考Django自帶的 login_required 裝飾器,但是功能是相反的情況,即用戶必須是未登錄的,否則用戶將被重定向到 settings.py 中定義的地址。當我們想要已登錄的用戶不允許進入某些視圖(比如登錄)時,非常有用。

def anonymous_required(function=None, redirect_url=None):

  if not redirect_url:
    redirect_url = settings.LOGIN_REDIRECT_URL

  actual_decorator = user_passes_test(
    lambda u: u.is_anonymous(),
    login_url=redirect_url
  )

  if function:
    return actual_decorator(function)
  return actual_decorator


# The way to use this decorator is:
@anonymous_required
def my_view(request, pk):
  ...

有關此裝飾器更多的介紹,可以參考這里

Superuser required

這個裝飾器和上面的 group_required 類似, 但是它只允許超級用戶才能訪問視圖。

from django.core.exceptions import PermissionDenied


def superuser_only(function):
  """Limit view to superusers only."""

  def _inner(request, *args, **kwargs):
    if not request.user.is_superuser:
      raise PermissionDenied
    return function(request, *args, **kwargs)

  return _inner


# The way to use this decorator is:
@superuser_only
def my_view(request):
  ...

有關此裝飾器更多的介紹,可以參考這里。

Ajax required

這個裝飾器用于檢查請求是否是AJAX請求,在使用jQuery等Javascript框架時,這是一個非常有用的裝飾器,也是一種保護應用程序的好方法。

from django.http import HttpResponseBadRequest


def ajax_required(f):
  """
  AJAX request required decorator
  use it in your views:
 
  @ajax_required
  def my_view(request):
    ....
 
  """

  def wrap(request, *args, **kwargs):
    if not request.is_ajax():
      return HttpResponseBadRequest()
    return f(request, *args, **kwargs)

  wrap.__doc__ = f.__doc__
  wrap.__name__ = f.__name__
  return wrap


# The way to use this decorator is:
@ajax_required
def my_view(request):
  ...

有關此裝飾器更多的介紹,可以參考這里。

Time it

如果您需要改進某個視圖的響應時間,或者只想知道運行需要多長時間,那么這個裝飾器非常有用。

def timeit(method):

  def timed(*args, **kw):
    ts = time.time()
    result = method(*args, **kw)
    te = time.time()
    print('%r (%r, %r) %2.2f sec' % (method.__name__, args, kw, te - ts))
    return result

  return timed


# The way to use this decorator is:
@timeit
def my_view(request):
  ...

有關此裝飾器更多的介紹,可以參考這里。

自定義功能

下面這個裝飾器只是一個示例,測試你能夠輕松地檢查某些權限或某些判斷條件,并100%自己定制。

 想象你有一個博客、購物論壇,如果用戶需要有很多積分才能發(fā)表評論,這是一個避免垃圾信息的好方法。下面創(chuàng)建一個裝飾器來檢查用戶是否已登錄并擁有超過10個積分,這樣才可以發(fā)表評論,否則將拋出一個Forbidden。

from django.http import HttpResponseForbidden

logger = logging.getLogger(__name__)
def user_can_write_a_review(func):
  """View decorator that checks a user is allowed to write a review, in negative case the decorator return Forbidden"""

  @functools.wraps(func)
  def wrapper(request, *args, **kwargs):
    if request.user.is_authenticated() and request.user.points < 10:
      logger.warning('The {} user has tried to write a review, but does not have enough points to do so'.format( request.user.pk))
      return HttpResponseForbidden()

    return func(request, *args, **kwargs)

  return wrapper

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

相關文章

  • Python趣味實戰(zhàn)之手把手教你實現(xiàn)舉牌小人生成器

    Python趣味實戰(zhàn)之手把手教你實現(xiàn)舉牌小人生成器

    前幾天寫了一個嬰兒級別的爬蟲圖文教程,大家很喜歡.恰好周末看到有人咨詢這個 “舉牌小人” 怎么做?基于此,我想借此為大家再寫一篇 “爬蟲應用” 的文章,教你制作一個好玩兒的 “舉牌小人” ,需要的朋友可以參考下
    2021-06-06
  • python列表使用實現(xiàn)名字管理系統(tǒng)

    python列表使用實現(xiàn)名字管理系統(tǒng)

    這篇文章主要為大家詳細介紹了python列表使用實現(xiàn)名字管理系統(tǒng),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-01-01
  • 使用python+pygame實現(xiàn)中秋節(jié)動畫效果

    使用python+pygame實現(xiàn)中秋節(jié)動畫效果

    馬上就要中秋節(jié)了,使用python可以實現(xiàn)中秋節(jié)動畫效果,包括月亮、兔子和煙花嗎?當然是可以的,那該如何實現(xiàn)呢?這篇文章我們主要使用pygame來實現(xiàn),文中有詳細的代碼示例供大家參考,需要的朋友可以參考下
    2023-09-09
  • pymysql的安裝以及操作實戰(zhàn)指南

    pymysql的安裝以及操作實戰(zhàn)指南

    這篇文章主要給大家介紹了關于pymysql的安裝以及操作的相關資料,pymsql是Python中操作MySQL的模塊,其使用方法和MySQLdb幾乎相同,文中通過代碼介紹的非常詳細,需要的朋友可以參考下
    2023-11-11
  • Python eval函數(shù)的實現(xiàn)

    Python eval函數(shù)的實現(xiàn)

    這篇文章主要介紹了Python eval函數(shù)的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2021-01-01
  • 使用PyTorch實現(xiàn)MNIST手寫體識別代碼

    使用PyTorch實現(xiàn)MNIST手寫體識別代碼

    今天小編就為大家分享一篇使用PyTorch實現(xiàn)MNIST手寫體識別代碼,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-01-01
  • Pytorch建模過程中的DataLoader與Dataset示例詳解

    Pytorch建模過程中的DataLoader與Dataset示例詳解

    這篇文章主要介紹了Pytorch建模過程中的DataLoader與Dataset,同時PyTorch針對不同的專業(yè)領域,也提供有不同的模塊,例如?TorchText,?TorchVision,?TorchAudio,這些模塊中也都包含一些真實數(shù)據(jù)集示例,本文給大家介紹的非常詳細,需要的朋友參考下吧
    2023-01-01
  • python中while循環(huán)語句用法簡單實例

    python中while循環(huán)語句用法簡單實例

    這篇文章主要介紹了python中while循環(huán)語句用法,以一個簡單實例形式分析了Python使用while循環(huán)語句使用方法,需要的朋友可以參考下
    2015-05-05
  • 一篇文章搞懂python的轉義字符及用法

    一篇文章搞懂python的轉義字符及用法

    這篇文章主要介紹了一篇文章搞懂python的轉義字符及用法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-09-09
  • python3調用百度翻譯API實現(xiàn)實時翻譯

    python3調用百度翻譯API實現(xiàn)實時翻譯

    這篇文章主要為大家詳細介紹了python3調用百度翻譯API,實現(xiàn)實時翻譯,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-08-08

最新評論

宁阳县| 连江县| 五大连池市| 阳谷县| 东台市| 武宁县| 满城县| 桐柏县| 长沙市| 隆德县| 林口县| 泌阳县| 肥东县| 蒙山县| 集贤县| 潢川县| 大同市| 临夏县| 东至县| 张掖市| 吉木乃县| 江口县| 年辖:市辖区| 甘肃省| 那坡县| 确山县| 山阳县| 长汀县| 林州市| 旅游| 渑池县| 德令哈市| 紫阳县| 邵阳市| 且末县| 乐昌市| 通海县| 特克斯县| 榆树市| 平武县| 泽普县|