Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/329.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 社会认证类问题研究_Python_Class_Flask_Rauth_Social Authentication - Fatal编程技术网

Python 社会认证类问题研究

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 %} 一些补充资料- 具体错误如下:

我正在编写米格尔·格林伯格关于社会认证的教程

在主页模板上,我有以下代码,我从教程中删除了twitter部分:

    <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]