我想设置一个Google App Enging(GAE)应用程序,它为Twitter,Facebook等提供OAuth2和OAuth1的登录功能,因此我选择了似乎是authomatic模块(http://peterhudec.github.io/authomatic/)使用方便。 但是现在我遇到了一些问题(我对整个Web服务编程的东西都很陌生)。
所以我拥有的是:
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()或post()替换任何一个,因为我已经有一个应用程序,我做了redirect('blog/42')
并且get(self, post_id)
自动将42
拆分为post_id
(示例可在此处找到http://udacity-cs253.appspot.com/static/hw5.tgz(请查看blog.py中的PostPage类))
所以我真的不明白这里发生的所有魔法;有人可以解释一下如何解决这个错误,以便为get() - 参数provider_name
分配值gl
。
答案 0 :(得分:2)
而不是
webapp2.Route(r'/login/gl', Login, handler_method='any')
使用
webapp2.Route(r'/login/<provider_name>', Login, handler_method='any')
现在,/login/
之后的路径将传递到def any
参数中的provider_name
。
即。请求/login/gl
会将“gl
”作为provider_name
传递给def any
。
答案 1 :(得分:1)
如果路径模板中有<...>
个模板变量,则处理程序方法只接受参数。每个模板变量都填充一个参数。要为provider_name
分配gl
,其中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