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

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

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

裝飾器作用

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

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

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

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

from django.contrib.auth.decorators import login_required

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

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

Django裝飾器

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

Group Required

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

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):
  ...

有關(guān)此裝飾器更多的介紹,可以參考這里

Anonymous required

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

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):
  ...

有關(guān)此裝飾器更多的介紹,可以參考這里。

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):
  ...

有關(guān)此裝飾器更多的介紹,可以參考這里

Ajax required

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

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):
  ...

有關(guān)此裝飾器更多的介紹,可以參考這里。

Time it

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

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):
  ...

有關(guān)此裝飾器更多的介紹,可以參考這里。

自定義功能

下面這個裝飾器只是一個示例,測試你能夠輕松地檢查某些權(quán)限或某些判斷條件,并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

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    一篇文章搞懂python的轉(zhuǎn)義字符及用法

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

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

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

最新評論

玉树县| 乌拉特后旗| 全椒县| 通道| 金昌市| 江山市| 龙江县| 都江堰市| 太湖县| 永胜县| 兴城市| 肇庆市| 砀山县| 陆丰市| 盐城市| 城口县| 灵台县| 涪陵区| 日土县| 东丽区| 定南县| 荆州市| 丽江市| 曲水县| 台北县| 金寨县| 彭泽县| 桂东县| 桂林市| 滦南县| 明星| 杨浦区| 吉安市| 双鸭山市| 罗田县| 嘉峪关市| 东辽县| 阳曲县| 葵青区| 临猗县| 桑日县|