AppEngine: gaierror при запуске задачи - PullRequest
0 голосов
/ 24 марта 2012

Я столкнулся с ошибкой, которую было больно отследить, поэтому я решил добавить сюда причину + «решение».

Настройка: Devbox - запуск Google App Engine для прослушивания на всех портах ("--address = 0.0.0.0"), обслуживающих URL, который запускает задачу. Клиент - Клиент (библиотека запросов Python), который запрашивает URL обратного вызова

App Код двигателя:

class StartTaskCallback(webapp.RequestHandler):
  def post(self):
    param = self.request.get('param')
    logging.info('STARTTASK: %s' % param)
    # launch a task
    taskqueue.add(url='/tasks/mytask',
                  queue_name='myqueue',
                  params={'param': param})

class MyTask(webapp.RequestHandler):
  def post(self):
    param = self.request.get('param')
    logging.info('MYTASK: param = %s' % param)

Когда я запрашивал обратный вызов через браузер, все работало, но тот же запрос от удаленного клиента дал мне следующую ошибку:

ERROR    2012-03-23 21:18:27,351 taskqueue_stub.py:1858] An error occured while sending the task "task1" (Url: "/tasks/mytask") in queue "myqueue". Treating as a task error.
Traceback (most recent call last):
  File "/Applications/GoogleAppEngineLauncher.app/Contents/Resources/GoogleAppEngine-default.bundle/Contents/Resources/google_appengine/google/appengine/api/taskqueue/taskqueue_stub.py", line 1846, in ExecuteTask
    connection.endheaders()
  File "/System/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/httplib.py", line 868, in endheaders
    self._send_output()
  File "/System/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/httplib.py", line 740, in _send_output
    self.send(msg)
  File "/System/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/httplib.py", line 699, in send
    self.connect()
  File "/System/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/httplib.py", line 683, in connect
    self.timeout)
  File "/System/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/socket.py", line 498, in create_connection
    for res in getaddrinfo(host, port, 0, SOCK_STREAM):
gaierror: [Errno 8] nodename nor servname provided, or not known

Эта ошибка будет просто вращаться в цикле при повторном выполнении задачи. Как ни странно, я мог пойти в Admin -> Task Queues и щелкнуть «Run», чтобы успешно завершить задачу.

Сначала я подумал, что это ошибка с привязкой. Я не получил бы ошибку, если бы я запросил StartTaskCallback через браузер или если я запустил клиент локально.

Наконец, я заметил, что App Engine использует поле запроса «host» для создания абсолютного URL-адреса для задачи. В /Applications/GoogleAppEngineLauncher.app/Contents/Resources/GoogleAppEngine-default.bundle/Contents/Resources/google_appengine/google/appengine/api/taskqueue/taskqueue_stub.py (1829):

  connection_host, = header_dict.get('host', [self._default_host])
  if connection_host is None:
    logging.error('Could not determine where to send the task "%s" '
                  '(Url: "%s") in queue "%s". Treating as an error.',
                  task.task_name(), task.url(), queue.queue_name)
    return False
  connection = httplib.HTTPConnection(connection_host)

В моем случае я использовал специальный файл name + hosts на удаленном клиенте для доступа к серверу. 192.168.1.208 devbox Таким образом, «хост» для удаленного клиента выглядел как «devbox: 8085», который локальный сервер не мог разрешить.

1 Ответ

2 голосов
/ 29 марта 2012

Чтобы устранить проблему, я просто добавил devbox в файл hosts моего сервера AppEngine, но было бы неплохо, если бы исключение gaierror напечатало имя, которое не удалось разрешить, или если App Engine не использовал хоствходящего запроса на создание URL для создания задачи.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...