这很奇怪。标题大部分都说,我的代码应该说其余部分。这是我的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的调用,所以我怀疑问题也可能在那个时候出现。如果有更好的方法,请告诉我们。感谢。
答案 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
的第二个实例 不同的端口,然后编写您的应用程序以使用其他服务器 在向自己提出请求时。
所以我想这可以解决我的问题(或至少给出一个令人满意的解释)。