Python 社会认证类问题研究
我正在编写米格尔·格林伯格关于社会认证的教程 在主页模板上,我有以下代码,我从教程中删除了twitter部分:Python 社会认证类问题研究,python,class,flask,rauth,social-authentication,Python,Class,Flask,Rauth,Social Authentication,我正在编写米格尔·格林伯格关于社会认证的教程 在主页模板上,我有以下代码,我从教程中删除了twitter部分: <h2>I don't know you!</h2> <p><a href="{{ url_for('oauth_authorize', provider='facebook') }}">Login with Facebook</a></p> {% endif %} 一些补充资料- 具体错误如下:
<h2>I don't know you!</h2>
<p><a href="{{ url_for('oauth_authorize', provider='facebook') }}">Login with Facebook</a></p>
{% endif %}
一些补充资料-
具体错误如下:
File "/Users/metersky/code/mylastapt/app/oauth.py", line 29, in get_provider
provider = provider_class()
File "/Users/metersky/code/mylastapt/app/oauth.py", line 73, in __init__
super(TwitterSignIn, self).__init__('twitter')
File "/Users/metersky/code/mylastapt/app/oauth.py", line 10, in __init__
credentials = current_app.config['OAUTH_CREDENTIALS'][provider_name]
KeyError: 'twitter'
这就是我认为问题可能发生的地方:
app.config['OAUTH_CREDENTIALS'] = {
'facebook': {
'id': 'XXX',
'secret': 'XXXX'
}
}
问题出在
OAuthSignIn.get\u provider
中
@classmethod
def get_provider(self, provider_name):
if self.providers is None:
self.providers = {}
for provider_class in self.__subclasses__():
provider = provider_class()
self.providers[provider.provider_name] = provider
return self.providers[provider_name]
@classmethod
def get_provider(cls, provider_name):
if cls.providers is None:
cls.providers = {}
for provider_class in cls.__subclassess__():
try:
provider = provider_class()
except KeyError:
pass # unsupported provider
else:
cls.providers[provider.provider_name] = provider
return cls.providers[provider_name]
第一次从你的视野中调用它时
oauth = OAuthSignIn.get_provider(provider)
该方法缓存您定义的提供程序。它通过检查所有的OAuthSignIn
子类来实现这一点
for provider_class in self.__subclasses__():
当您包含TwitterSignIn
时,它将作为子类包含。然后将实例化该类的一个实例
provider = provider_class()
在OAuthSignIn.\uuuuu init\uuuuuuuu
中,您使用当前的应用程序配置['OAUTH\u凭据][provider\u name]
加载提供程序的设置。因为Twitter不包括在内,所以您会得到KeyError
如果您不想支持Twitter,只需删除该类即可。如果您想进一步保护应用程序,以便在不更新代码的情况下从设置中删除提供程序,则需要检查异常。您可以在OAuthSignIn.\uuuu init\uuuu
中进行检查,但是在OAuthSignIn.providers
中包含不受支持的提供程序可能没有多大价值。您最好推迟签入OAuthSignIn.get\u provider
@classmethod
def get_provider(self, provider_name):
if self.providers is None:
self.providers = {}
for provider_class in self.__subclasses__():
provider = provider_class()
self.providers[provider.provider_name] = provider
return self.providers[provider_name]
@classmethod
def get_provider(cls, provider_name):
if cls.providers is None:
cls.providers = {}
for provider_class in cls.__subclassess__():
try:
provider = provider_class()
except KeyError:
pass # unsupported provider
else:
cls.providers[provider.provider_name] = provider
return cls.providers[provider_name]