0

这很奇怪。标题说明了大部分内容,我的代码应该说明其余部分。这是我的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通话中,也没有任何变化。我使用 JQuery 测试了 API httpie,它工作得非常好,并且在 5 秒内返回。

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

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

4

2 回答 2

1

您正在尝试从您的应用程序中获取一个 URL,这在 Google App Engine 上是强烈反对的。

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

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

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

在生产环境中,GAE 会阻止 fetch 服务调用相同的应用程序。

为了防止应用程序导致请求的无限递归,请求处理程序不允许获取自己的 URL。使用其他方式仍然可能导致无休止的递归,因此如果您的应用可以获取用户提供的 URL 请求,请谨慎行事。

于 2013-04-05T07:24:39.590 回答
0

在升级 SDK 时,我注意到DevServer 页面中添加了以下内容:

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

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

于 2013-04-05T07:07:13.593 回答