0

我有一个基本的应用程序。我使用 twitter api 1.1 和 python。当我在本地运行时,我没有收到任何错误,但在部署后我收到了 DeadlineExceededError 错误。这是日志msj:

Traceback (most recent call last):
  File "/base/data/home/runtimes/python27/python27_lib/versions/1/google/appengine/runtime/wsgi.py", line 266, in Handle
    result = handler(dict(self._environ), self._StartResponse)
  File "/base/data/home/runtimes/python27/python27_lib/versions/third_party/webapp2-2.5.2/webapp2.py", line 1529, in __call__
    rv = self.router.dispatch(request, response)
  File "/base/data/home/runtimes/python27/python27_lib/versions/third_party/webapp2-2.5.2/webapp2.py", line 1278, in default_dispatcher
    return route.handler_adapter(request, response)
  File "/base/data/home/runtimes/python27/python27_lib/versions/third_party/webapp2-2.5.2/webapp2.py", line 1102, in __call__
    return handler.dispatch()
  File "/base/data/home/runtimes/python27/python27_lib/versions/third_party/webapp2-2.5.2/webapp2.py", line 570, in dispatch
    return method(*args, **kwargs)
  File "/base/data/home/apps/s~tweetllrio/1.370638782538988919/main.py", line 52, in post
    ''+username+'&max_id='+str(max_id)+'&count=200')
  File "libs/oauth2/__init__.py", line 676, in request
    uri = req.to_url()
  File "libs/oauth2/__init__.py", line 421, in to_url
    query = parse_qs(query)
  File "/base/data/home/runtimes/python27/python27_dist/lib/python2.7/urlparse.py", line 382, in parse_qs
    for name, value in parse_qsl(qs, keep_blank_values, strict_parsing):
  File "/base/data/home/runtimes/python27/python27_dist/lib/python2.7/urlparse.py", line 423, in parse_qsl
    name = unquote(nv[0].replace('+', ' '))
  File "/base/data/home/runtimes/python27/python27_dist/lib/python2.7/urlparse.py", line 337, in unquote
    if _is_unicode(s):
DeadlineExceededError

这是 main.py

class Search(webapp2.RequestHandler):

    def post(self):
        username = self.request.get("contenta")
        word = self.request.get("contentc")
        header, response = client.request(
            'https://api.twitter.com/1.1/statuses/user_timeline'
            '.json?include_entities=true&screen_name='+username+'&count=1')
        name = json.loads(response)[0]["user"]["name"]
        image = json.loads(response)[0]["user"]["profile_image_url"]
        max_id = json.loads(response)[0]["id"]
        count = 0
        tweets = []
        while count < 18:
            header, response = client.request(
                'https://api.twitter.com/1.1/statuses/user_timeline'
                '.json?include_entities=true&include_rts=false&screen_name='
                ''+username+'&max_id='+str(max_id)+'&count=200')
            for index in range(len(json.loads(response))-1):
                if word in json.loads(response)[index]["text"]:
                    tweets.append(json.loads(response)[index]["text"])
            max_id = json.loads(response)[len(json.loads(response))-1]["id"]
            count += 1

        template = JINJA_ENVIRONMENT.get_template('index.html')
        self.response.write(template.render(
            {"data": tweets[::-1], "name": name, "image": image, "da":len(tweets)})
        )
class MainPage(webapp2.RequestHandler):

    def get(self):

        template = JINJA_ENVIRONMENT.get_template('index.html')
        self.response.write(template.render({}))

application = webapp2.WSGIApplication([
    ('/', MainPage),
    ('/search', Search),
    ('/add', AddUSer),
], debug=True)

请问你能帮我吗?如果您想查看任何代码,请告诉我。

4

2 回答 2

1

正如Wooble在评论中提到的, 这个Stack Overflow 问题包含您看到的DeadlineExceededError的可能答案。

但是,我将尝试解释答案,以帮助您解决问题。

您可以使用普通的 Python 库urlliburllib2httplib在 App Engine 上获取互联网资源。但是,在 Google App Engine 上,这些库使用 Google URL Fetch 服务来获取 Internet 资源。这意味着其他一些服务器集(除了实际托管您的应用程序的服务器)将为您获取数据。

使用 URL Fetch 服务在 App 引擎上获取资源时,如果请求未在规定的期限内完成(应用程序指定的或默认的60 秒),则抛出 DeadlineExceededException。

引用Dealing with DeadlineExceededError

如果目标网站存在性能问题或通常需要超过 60 秒的时间来回复,则使用 URLFetch 向外部 URL 发出请求也会产生 DeadlineExceededErrors。在这些情况下,记录的 DeadlineExceededErrors 堆栈跟踪应包含对 URLFetch 库的调用。

可能是 twitter API 请求没有在规定的期限内完成。尝试以下方法之一:

  1. 以异步方式获取 twitter 资源。
  2. 指定大于 60 秒(如 120 秒)的明确截止日期,并检查请求是否成功完成。我不会推荐这种方法,因为这纯粹与应用程序运行的场景相关,并且更多地基于试错技术。
于 2013-10-02T18:58:53.523 回答
0

问题是您的整体请求需要超过 60 秒才能完成。这不是因为您使用 urlfetch - 通常会在几秒钟内超时,如果超时,您可以在 60 秒的限制内很好地处理错误。

问题实际上是您发出18 个urlfetch 请求。由于每个请求可能需要几秒钟,因此很容易将其加起来并达到 60 秒的限制。

您可能需要重新构建 main.py 并在任务队列中获取实际的 URL,并将结果存储在数据存储中。任务队列可以运行更长时间。

在 Search 返回后,您将需要某种类型的第二个处理程序来检查任务的状态。

于 2013-10-03T01:09:02.740 回答