2012-05-20 2 views
1

다음과 같이 내가 login_required 장식이 로그인하는 URL을 계속 합격 :어떻게 필수 실내 장식

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에 의해 렌더링되는) 내가하는 옵션이 경우 사용자가 이미지를 업로드하기 위해 손님과 사용자가 모두 볼 수 있습니다. 양식을 게시하자마자 @login_required 데코레이터를 사용하는 다른 Handler에 의해 처리됩니다.

은 내가 사용자가 로그인 한 후 동일한 페이지에 다시 재 가도록 (듯이), 리디렉션 동안은 check_login 기능에서 사용할 수있는 continue_url 변수를 전달하고 달성하고자합니다.

+0

POST 요청에 대한 응답으로 리디렉션하면 메소드가 보존되지 않습니다. 리다이렉션 된 요청은 GET을 사용하며 리디렉션 전에 서버의 어딘가에 POST 본문을 저장하지 않으면 사용자의 데이터가 손실됩니다. –

답변

2

기본적으로 사용하면 장식 자에게 인수를 전달하려는 것처럼 들립니다. 파이썬은 이것을 지원합니다. 기본 아이디어는 @decorated(argument) def foo(...)def foo(...); foo = decorated(argument)(foo)과 동일하다는 것입니다.

따라서 decorateddecorated(argument)foo으로 장식 할 수 있도록해야합니다. 이것을위한 몇 가지 조리법이 있습니다. 여기에 하나 - decorated(argument)argument를 저장하고 호출 할 때 그것을 사용하는 호출 대상이되도록하는 __call__ 방법 decorated 클래스를 만들 :

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 기능은 대상 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.handler 인 Upload.handler로 리디렉션됩니다. Upload.handler는 폼을 유효화하고 게시합니다. LoginHandler에서 로그인하지 않은 경우 Login.html 페이지로 리디렉션됩니다. 따라서 request.get_url()을 호출하면 Homepage.html 대신 Upload.html이 반환됩니다. – Amyth