2014-09-09 4 views
1

OAuth2 및 OAuth1과 함께 Twitter, Facebook, Facebook 용 로그인 기능을 제공하는 Google App Enging (GAE) 앱을 설정하려고합니다. ... 따라서 사용하기 쉬운 자동 모듈 (http://peterhudec.github.io/authomatic/)을 선택했습니다. 하지만 이제는 몇 가지 문제가 있습니다 (전체 웹 서비스 프로그래밍에 익숙합니다).주어진 URL을 분할하는 방법을 정의하는 방법 (Google 애플리케이션 엔진의 경우 python webapp2에서)

그래서 내가 가지고있는 것은 :

import os 
import sys 
import webapp2 
from authomatic import Authomatic 
from authomatic.adapters import Webapp2Adapter 

from config import CONFIG 

authomatic_dir = os.path.join(os.path.dirname(__file__), 'authomatic') 
sys.path.append(authomatic_dir) 

# Instantiate Authomatic. 
authomatic = Authomatic(config=CONFIG, secret='some random secret string') 

# Create a simple request handler for the login procedure. 
class Login(webapp2.RequestHandler): 
    # The handler must accept GET and POST http methods and 
    # Accept any HTTP method and catch the "provider_name" URL variable. 
    def any(self, provider_name):#HERE IS THE PROBLEM 
     ... 

class Home(webapp2.RequestHandler): 
    def get(self): 
     # Create links to the Login handler. 
     self.response.write('Login with <a href="login/gl">Google</a>.<br />') 


# Create routes. 
ROUTES = [webapp2.Route(r'/login/gl', Login, handler_method='any'), 
      webapp2.Route(r'/', Home)] 


# Instantiate the webapp2 WSGI application. 
application = webapp2.WSGIApplication(ROUTES, debug=True) 

그리고 내가 오류는 다음과 같습니다

"any() takes exactly 2 arguments (1 given)" 

이미 응용 프로그램을했기 때문에 내가() 또는 포스트() GET 어떤 대체하려고 내가 한 곳은 redirect('blog/42') 이고 get(self, post_id)42post_id (예 : http://udacity-cs253.appspot.com/static/hw5.tgz (blog.py의 PostPage 클래스를보세요)에서 찾을 수 있음)으로 자동으로 나눕니다.

그래서 여기서 일어나는 모든 마법을 이해하지 못합니다. 누군가가이 오류를 해결하는 방법을 설명해 주시겠습니까? 그래서 get() - 매개 변수 provider_namegl 값이 지정됩니다.

답변

1

경로 템플릿에 <...> 템플릿 변수가있는 경우 처리기 메서드는 인수 만 사용합니다. 각 템플릿 변수는 인수를 채 웁니다. provider_namegl이 경로 경로의 일부입니다 gl를 할당 할 경우,이 같은 뭔가 ROUTES을 변경

ROUTES = [webapp2.Route(r'/login/<:.*>', Login, handler_method='any'), 
      webapp2.Route(r'/', Home)] 

더 많은 정보 : https://webapp-improved.appspot.com/api/webapp2.html#webapp2.Route

+0

감사! webapp2.Route (r '/ login/<:.*>/', TwoParamTestHandler)를 사용하면 TwoParamTestHandler의 get() - 함수가 자동으로 def get (self, firstParam, secondParam)을 처리합니다. – user1911091

+1

예. 라우트 템플리트가 주어지면'get()'은 세 개의 인수, 즉'self'와 두 개의 일치 패턴 (하나는 위치 지정자, 하나는 이름이 지정됨)으로 호출됩니다. –

2

대신

webapp2.Route(r'/login/gl', Login, handler_method='any') 

의 사용

webapp2.Route(r'/login/<provider_name>', Login, handler_method='any') 

이제 /login/ 다음의 경로는 매개 변수의 def any으로 전달됩니다.

e.e. /login/gl을 요청하면 provider_name에서 def any으로 "gl"이 전달됩니다.

+0

이것은 댄 샌더슨이 말한 것과 본질적으로 더 가깝기 때문에 경로를 좀 더 읽기 쉽게 만듭니다. –