2013-04-04 3 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=30 к моему urlfetch вызов. Я тестировал API, используя httpie и JQuery, и он отлично работает и возвращается менее чем за 5 секунд.

Я рассмотрел другие вопросы, но я все еще спотыкаюсь в темноте. Помощь, советы или рефакторинг будут оценены.

Я планирую добавлять вызовы к API поиска StackEchange, поэтому я подозреваю, что проблема может возникнуть и в то время. Если есть лучший способ сделать это, скажите, пожалуйста. Благодарю.

ответ

0

При модернизации SDK, я заметил это дополнение к DevServer page:

Примечание: dev_appserver.py может служить лишь один запрос одновременно. Если ваше приложение делает запросы выборки URL самому себе при обработке запроса , эти запросы будут терпеть неудачу при использовании сервера разработки . (Они не сбой при работе в App Engine.) Чтобы протестировать такие запросы , вы можете запустить второй экземпляр dev_appserver.py на другом порту , а затем закодировать приложение для использования другого сервера при выполнении запросов к себе.

Поэтому я предполагаю, что решает мою проблему (или, по крайней мере, дает удовлетворительное объяснение).

1

Вы пытаетесь найти URL-адрес и из своего приложения, которое сильно не поощряется в Google App Engine.

Локально вы не сможете вызвать сервер разработки, поскольку он обслуживает только один запрос за раз. Многопоточность не наблюдается.

Примечание: новый экспериментальный сервер разработки теперь может обрабатывать несколько запросов одновременно.

Многопоточная подача для повышения производительности для сложных приложений и более правильная семантика, например. доступ к вашему собственному приложению через urlfetch больше не является взаимоблокировками.

В производственной среде GAE запрещает услуге выборки вызывать одно и то же приложение.

Чтобы предотвратить бесконечную рекурсию запросов приложения, обработчик запроса не может получить свой собственный URL-адрес. По-прежнему можно вызвать бесконечную рекурсию другими способами, поэтому будьте осторожны, если ваше приложение может быть выполнено для получения запросов на URL-адреса, предоставленные пользователем.

+0

Что вы предлагаете мне тогда? –

+0

Я не уверен, чего вы пытаетесь достичь. Я думаю, вам следует отделить обработчик запросов API и его партнеров по реализации. Затем вы можете напрямую вызвать реализацию api. Кстати, у вас не будет проблем с загрузкой API StackExchange. –

+0

Я просто хочу, чтобы одна часть кода использовала SE API и обрабатывала ее, а затем передавала ее на другую часть интерфейса. Я хочу отделить интерфейс от обработки, поскольку я хочу иметь интерфейс AJAX. –

Смежные вопросы