搜尋此網誌

2015年11月3日 星期二

Python 方法修飾器 (at) @

Python 主要有三個修飾器,函式修飾器、類別修飾器、方法修飾器
修飾器的功能可以在不修改其他程式下,新增其他功能。

修飾器會把整個Function傳入到你要的程式中,而方法修飾器還另外會再把你的程式中第一個引數傳入(一般是用self)

以下是一個範例,建立一個方法的登入驗證

1.先建立一個登入驗證的function
def verify(func):
    def wrapper(self):
        處理self資訊.....
        return func(self)
    return wrapper

2.再建立一個需要進入登入驗證的方法,並且我們只需要在需要的方法上面一行加上 @verify
class Web:
    @verify
    def menu(request):
        return render(request, "menu.html")

這樣的做法就會在要進入menu之前,先將menu傳入verify的func,
並且將 menu 的request參數傳入wrapper的self。
當通過驗證的時候,就會回傳function到原來的menu,讓menu繼續執行,
或是不通過的時候,可以在 wrapper中return其他的地方,像是下面的方式。

def verify(func):
    def wrapper(self):
        if self.POST["password"] == "123456:
            return func(self)
        else:
            return render(self, "Login.html")
    return wrapper

如果在 Django 當中self不習慣的話,也可以改回request
def verify(func):
    def wrapper(request):
        if request.POST["password"] == "123456:
            return func(request)
        else:
            return render(request, "Login.html")
    return wrapper



完整的程式大概長得像是下面這樣。
def verify(func):
    def wrapper(request, *args, **kwargs):
        if request.POST["password"] == "123456:
            return func(request, *args, **kwargs)
        else:
            return render(request, "Login.html")
    return wrapper

class Web:
    @verify
    def menu(request):
        return render(request, "menu.html")