2012-05-20 27 views
1

login_required裝飾如下:如何通過繼續網址需要登錄裝飾

def login_required(function): 
    """ Decorator to check Logged in users.""" 
    def check_login(self, *args, **kwargs): 
    if not self.auth.get_user_by_session(): 
     self.redirect('/_ah/login_required') 
    else: 
     return function(self, *args, **kwargs) 
    return check_login 

現在我有一個Page(這是由一個獨立的Handler渲染),我有一個選項,用戶可以上傳圖片這可以由客人和用戶同時觀看。一旦表格被髮布,它就會被另一個Handler處理,其使用@login_required修飾器。

我想要實現的是通過一個continue_url變量,我可以在check_login功能,而重定向,以便用戶獲取登錄後重定向回到同一頁中使用。

+0

請注意,響應POST請求的重定向不會保留該方法 - 重定向的請求將使用GET,除非您在重定向之前將服務器主體存儲在服務器的某處,否則用戶數據將會丟失。 –

回答

2

所以基本上,這聽起來像你想,當你使用它的參數傳遞給裝飾。 Python確實支持這一點。基本思想是@decorated(argument) def foo(...)相當於def foo(...); foo = decorated(argument)(foo)

因此,您需要使decorated成爲decorated(argument)可以修飾foo的東西。這有幾個食譜。這裏有一個 - 讓decorated一類與__call__方法,使decorated(argument)是存儲argument,並使用它調用時可調用對象:

class decorator(object): 
    def __init__(argument): 
     self.argument = argument 

    def __call__(self, wrapped): 
     def wrapper(args_for_wrapped): 
      do_something_with(self.argument) 
      wrapped(args_for_wrapped) 
      whatever_else_this_needs_to_do() 
     return wrapper 

這也與普通的功能(和額外的層面上實現嵌套),涉及到functools.partial等技巧

+0

所以你的意思是傳遞價值,我可以簡單地使用@login_reuired(continue_url)??感謝您的答覆。 – Amyth

2

create_login_url函數獲取目標網址作爲其第一個參數。您可以從請求對象獲取dest_url。

def login_required(func): 

    def _wrapper(request, *args, **kw): 
     user = users.get_current_user() 
     if user: 
      return func(request, *args, **kw) 
     else: 
      return request.redirect(users.create_login_url(request.get_url())) 

    return _wrapper 
+0

頁面通過webapp2.Route方法進行路由,該方法在get方法下顯示模板中的表單。但是,該頁面有多種形式,並且每個頁面都有一個action =「」字段,它是上傳處理程序的路由。因此,例如從Homepage.html中用戶發佈表單的地方重定向到Upload.html,它基本上是UploadHandler,它驗證併發布表單。從UploadHandler中,如果用戶沒有登錄,他/她將被重定向到Login.html頁面。所以你不覺得調用request.get_url()會返回Upload.html而不是Homepage.html嗎? – Amyth