2013-04-04 57 views
0

這非常奇怪。標題說大部分,我的代碼應該說剩下的。這是我的main.py文件:GAE應用程序本地提高了DeadlineExceededError並部署了DownloadError

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=30urlfetch呼叫。我使用httpie和JQuery測試了API,它工作得很好,並在5秒內返回。

我看着其他問題,但我仍然陷入黑暗中。幫助,提示或重構,將不勝感激。

我打算增加對StackEchange Search API的調用,所以我懷疑這個問題也可能在那個時候出現。如果有更好的方法來做到這一點,請告訴。謝謝。

回答

0

雖然升級SDK,我注意到了這一點除了DevServer page

注:dev_appserver.py只能服務於一個時間一個請求。如果您的 應用程序在處理 請求時向其自身發出URL獲取請求,則在使用開發Web 服務器時,這些請求將失敗。 (在App Engine上運行時,它們不會失敗。)要測試此類 請求,可以在 不同端口上運行dev_appserver.py的第二個實例,然後在向自己發出請求時使用其他服務器 編寫代碼。

所以我想這解決了我的問題(或至少給出了令人滿意的解釋)。

1

您正試圖從您的應用程序中獲取URL,該應用程序在Google App Engine上強烈建議不要。

本地你將無法調用開發服務器,因爲它一次只提供一個請求。沒有觀察到多線程。

注意:新的實驗開發服務器現在能夠一次處理多個請求。

多線程服務爲複雜應用程序和更正確的語義提供更好的性能,例如,通過urlfetch訪問自己的應用程序不再是死鎖。

在生產環境中,GAE阻止提取服務調用同一個應用程序。

爲了防止應用程序導致無限遞歸的請求,請求處理程序不允許獲取自己的URL。仍然有可能通過其他方式導致無限遞歸,因此如果可以使您的應用能夠獲取用戶提供的URL請求,請謹慎行事。

+0

你建議我做什麼呢? – 2013-04-05 07:26:20

+0

我不確定你想要達到什麼目的。我認爲你應該分開API請求處理程序及其實現對象。然後你可以直接調用api實現。順便說一下,你將不會有任何問題獲取StackExchange API。 – 2013-04-05 07:37:46

+0

我只想讓代碼的一部分使用SE API並處理它,然後將它傳遞給其他接口部分。我想從處理中分離UI,因爲我想要一個類似AJAX的界面。 – 2013-04-05 08:28:10