代码:未知,错误:从“ api.twitter.com”获取请求令牌时响应无效-如何获取和打印Twitter错误消息

时间:2018-08-20 22:56:11

标签: django twitter django-allauth

我在Django 2.0.8和3.5中使用Django Allauth

我已按照使用Twitter登录网站的说明进行操作。但是,当我尝试登录我的网站时,出现以下消息:

  

社交网络登录失败

     

尝试通过您的社交网络帐户登录时发生错误。

没有包含更多信息的日志输出-这使得调试变得不必要地困难。基于对此question的回答,我向自己的模板中添加了一些信息,从而使我们更加了解:

  

代码:{{auth_error.code}},错误:{{auth_error.exception}}

但是,错误消息是:

  

代码:未知,错误:从“ api.twitter.com”获取请求令牌时响应无效

没有什么帮助。我想查看twitter.api返回的实际响应,因此可以深入探究问题-但是,对于我来说,如何输出或记录从中获得的 ACTUAL 响应并不清楚twitter API。

当我尝试使用django-allauth登录时,如何查看/捕获Twitter API响应?

2 个答案:

答案 0 :(得分:0)

检查django-allauth代码,我可以找到导致以下错误的逻辑。 Error Code

        if response.status_code not in [200, 201]:
            raise OAuthError(
                _('Invalid response while obtaining request token'
                  ' from "%s".') % get_token_prefix(
                      self.request_token_url))

这表明如果响应代码不成功,即200或201,则将引发此异常。因此,您可以看到它在没有记录响应的情况下引发了错误。

可能还有其他方法来记录响应,但是这需要库的维护者或浏览整个库的人员提供一些帮助。

现在问您一个问题,如何记录此响应。我看到的最简单的方法是在服务器中编辑本地文件socialaccount/providers/oauth/client.py并放置记录器。新文件socialaccount/providers/oauth/client.py如下所示:

import logging
LOG_FILENAME = "django_allauth_response.log"
logger = logging.getLogger(__name__)
logger.setLevel(logging.INFO)
handler = RotatingFileHandler(LOG_FILENAME, maxBytes=20000000, backupCount=2)
formatter = logging.Formatter('%(levelname)s: %(asctime)s %(message)s')
handler.setFormatter(formatter)
logger.addHandler(handler)
......... 
.........
same code as in allauth/socialaccount/providers/oauth/client.py
.........

logger.info("Response of authentication:" + str(response)) #add this line
if response.status_code not in [200, 201]:
    raise OAuthError(
        _('Invalid response while obtaining request token'
          ' from "%s".') % get_token_prefix(
              self.request_token_url))

在此之后,一旦在服务器中运行它,便可以打开django_allauth_response.log文件并检查响应。

P.S。。设置记录器可能需要进行一些细微调整,而且大多数情况下,您还需要在响应的字符串转换上做更多的工作。

答案 1 :(得分:0)

我在Twitter上曾两次遇到此问题,而两次都是回调URL。有一次我没有在结尾加上尾随/。下次,我使用的是使用www的回调URL。刚开始时,但是是从其他子域访问该网站。

此外,我按照之前的建议进行了修改,并在AllAuth中修改了文件client.py,但是我发现可以通过

将错误输出到网络上
            raise OAuthError(
                _('Invalid response while obtaining request token'
                  ' from "%s". (' + str(response.status_code) + ') and (' + str(response.text) + ')') 
                    % get_token_prefix(
                      self.request_token_url))