GAE app在本地提升DeadlineExceededError并部署了DownloadError

时间:2013-04-04 17:22:10

标签: python google-app-engine urlfetch deadlines

这很奇怪。标题大部分都说,我的代码应该说其余部分。这是我的main.py文件:

from google.appengine.api import urlfetch
import webapp2
import jinja2

import json
import os

jinja_environment = jinja2.Environment(
    loader=jinja2.FileSystemLoader(os.path.dirname(__file__)))


class MainPage(webapp2.RequestHandler):
    def get(self):
        response = urlfetch.fetch("http://localhost:8080/api/helloworld?name=totty", method=urlfetch.GET)
        if response.status_code == 200:
            result = json.loads(response.content)

        template_values = {'response': result['msg']}
        template = jinja_environment.get_template('index.html')
        self.response.out.write(template.render(template_values))


app = webapp2.WSGIApplication(
    [('/', MainPage)],
    debug=True)

这是我的api.py文件:

import webapp2
import json

class HelloWorld(webapp2.RequestHandler):
    def get(self):
        name = self.request.get('name') or 'world'
        msg = "Hello {}!".format(name)
        payload = json.dumps({'msg': msg})
        # payload = json.dumps({'dir': str(dir(self.request)), 'body': str(self.request.body), 'name': str(self.request.arguments())})

        self.response.headers['Content-Type'] = 'application/json'
        self.response.write(payload)

app = webapp2.WSGIApplication(
    [('/api/helloworld', HelloWorld)],
    debug=True)

如果我的app.yaml文件有帮助:

application: stacksort
version: 1
runtime: python27
api_version: 1
threadsafe: true

handlers:
- url: /api/.*
  script: api.app
- url: /.*
  script: main.app

libraries:
- name: webapp2
  version: latest
- name: jinja2
  version: latest

即使我将deadline=30添加到urlfetch来电,也没有任何变化。我使用httpie和JQuery测试了API,它工作得非常好并且在5秒内返回。

我看了其他问题,但我仍然陷入黑暗中。帮助,提示或重构将不胜感激。

我计划添加对StackEchange Search API的调用,所以我怀疑问题也可能在那个时候出现。如果有更好的方法,请告诉我们。感谢。

2 个答案:

答案 0 :(得分:1)

您正试图在Google App Engine上强烈建议不要在您的应用程序中提取URL。

在本地,您将无法调用开发服务器,因为它一次只能处理一个请求。没有观察到多线程。

注意:新的实验开发服务器现在能够一次处理多个请求。

  

多线程服务,可为复杂应用程序提供更好的性能,并提供更正确的语义,例如:通过urlfetch访问您自己的应用程序不再死锁。

在生产环境中,GAE会阻止提取服务调用同一个应用程序。

  

为防止应用程序导致无休止的请求递归,请求处理程序不允许获取自己的URL。仍然可以通过其他方式进行无限递归,因此如果您的应用程序可以获取用户提供的URL请求,请务必小心。

答案 1 :(得分:0)

升级SDK时,我注意到DevServer page

的这一新增内容
  

注意:dev_appserver.py一次只能投放一个请求。如果你的   应用程序在处理时对其自身进行URL提取请求   请求,这些请求在使用开发Web时将失败   服务器。 (在App Engine上运行时,它们不会失败。)要测试它   请求,您可以在a上运行dev_appserver.py的第二个实例   不同的端口,然后编写您的应用程序以使用其他服务器   在向自己提出请求时。

所以我想这可以解决我的问题(或至少给出一个令人满意的解释)。