Я столкнулся с ошибкой, которую было больно отследить, поэтому я решил добавить сюда причину + «решение».
Настройка:
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», который локальный сервер не мог разрешить.