Ошибка HTTP-сервера dev-server 403: запрещено
После обновления с 1.7.5 (где все работало нормально) я получаю сообщение об ошибке HTTP 403. Запрещено при попытке открыть любой сайт через localhost. Странно то, что у меня дома почти такие же настройки, как и на работе, и там все работает... Может быть, проблема с прокси-сервером, который мы используем на работе, так как это единственное различие, о котором я могу думать? Вот журнал ошибок, который я получаю, поэтому, если кто-то знает, что происходит, помогите (;
Traceback (most recent call last):
File "U:\Dev\GAE\lib\cherrypy\cherrypy\wsgiserver\wsgiserver2.py", line 1302, in communicate
req.respond()
File "U:\Dev\GAE\lib\cherrypy\cherrypy\wsgiserver\wsgiserver2.py", line 831, in respond
self.server.gateway(self).respond()
File "U:\Dev\GAE\lib\cherrypy\cherrypy\wsgiserver\wsgiserver2.py", line 2115, in respond
response = self.req.server.wsgi_app(self.env, self.start_response)
File "U:\Dev\GAE\google\appengine\tools\devappserver2\wsgi_server.py", line 246, in __call__
return app(environ, start_response)
File "U:\Dev\GAE\google\appengine\tools\devappserver2\request_rewriter.py", line 311, in _rewriter_middleware
response_body = iter(application(environ, wrapped_start_response))
File "U:\Dev\GAE\google\appengine\tools\devappserver2\python\request_handler.py", line 89, in __call__
self._flush_logs(response.get('logs', []))
File "U:\Dev\GAE\google\appengine\tools\devappserver2\python\request_handler.py", line 220, in _flush_logs
apiproxy_stub_map.MakeSyncCall('logservice', 'Flush', request, response)
File "U:\Dev\GAE\google\appengine\api\apiproxy_stub_map.py", line 94, in MakeSyncCall
return stubmap.MakeSyncCall(service, call, request, response)
File "U:\Dev\GAE\google\appengine\api\apiproxy_stub_map.py", line 320, in MakeSyncCall
rpc.CheckSuccess()
File "U:\Dev\GAE\google\appengine\api\apiproxy_rpc.py", line 156, in _WaitImpl
self.request, self.response)
File "U:\Dev\GAE\google\appengine\ext\remote_api\remote_api_stub.py", line 200, in MakeSyncCall
self._MakeRealSyncCall(service, call, request, response)
File "U:\Dev\GAE\google\appengine\ext\remote_api\remote_api_stub.py", line 226, in _MakeRealSyncCall
encoded_response = self._server.Send(self._path, encoded_request)
File "U:\Dev\GAE\google\appengine\tools\appengine_rpc.py", line 393, in Send
f = self.opener.open(req)
File "U:\Dev\Python\lib\urllib2.py", line 410, in open
response = meth(req, response)
File "U:\Dev\Python\lib\urllib2.py", line 523, in http_response
'http', request, response, code, msg, hdrs)
File "U:\Dev\Python\lib\urllib2.py", line 448, in error
return self._call_chain(*args)
File "U:\Dev\Python\lib\urllib2.py", line 382, in _call_chain
result = func(*args)
File "U:\Dev\Python\lib\urllib2.py", line 531, in http_error_default
raise HTTPError(req.get_full_url(), code, msg, hdrs, fp)
HTTPError: HTTP Error 403: Forbidden
INFO 2013-04-19 12:28:52,576 server.py:561] default: "GET / HTTP/1.1" 500 -
INFO 2013-04-19 12:28:52,619 server.py:561] default: "GET /favicon.ico HTTP/1.1" 304 -
Также лаунчер выдает ошибку при закрытии:
Traceback (most recent call last):
File "launcher\mainframe.pyc", line 327, in OnStop
File "launcher\taskcontroller.pyc", line 167, in Stop
File "launcher\dev_appserver_task_thread.pyc", line 82, in stop
File "launcher\taskthread.pyc", line 107, in stop
File "launcher\platform.pyc", line 397, in KillProcess
pywintypes.error: (5, 'TerminateProcess', 'Access is denied.')
3 ответа
У меня была такая же проблема с моим MacOSX при использовании прокси-сервера с использованием Google App Engine Launcher 1.8.6. Очевидно, есть проблема с "proxy_bypass" на "urllib2.py".
Есть два возможных решения:
- Понижение до 1.7.5, но кто хочет понизить?
Отредактируйте "[путь установки GAE]/google/appengine/tools/appengine_rpc.py" и найдите строку с надписью
opener.add_handler(fancy_urllib.FancyProxyHandler())
В моем компьютере это была строка 578, а затем поместите хеш (#) в начало строки, например:
`#opener.add_handler(fancy_urllib.FancyProxyHandler())`
Сохраните файл, остановите и перезапустите приложение. Теперь dev_appserver.py вообще не должен пытаться использовать какой-либо прокси-сервер.
Если ваше приложение использует какие-либо внешние ресурсы, такие как веб-сервис SOAP или что-то в этом роде, и вы не можете получить доступ к серверу без прокси-сервера, вам придется понизить версию. Помните, что внешние файлы javascript (например, Facebook SDK или аналогичные) загружаются из вашего браузера, а не из вашего приложения.
Так как я не использую внешние сервисы REST или SOAP, это сработало для меня!
Надеюсь, это сработает и для вас.
Попробуйте либо: -Доступ к нему через другой прокси. IE прокси в прокси-доступ к нему через ваш локальный IP, т.е. 192.168.1.1
Я столкнулся с той же проблемой с версией 1.9.5. Похоже, что прокси-сервер API отправляет некоторые RPC на прокси-сервер, которые затем отклоняются с помощью HTTP 403 (поскольку прокси-серверы обычно настроены на отклонение попыток подключения к произвольным портам). В моем случае я использовал urlfetch
Модуль в моем приложении для доступа к внешним веб-страницам, поэтому отключение прокси-сервера не было для меня выбором.
Вот как я работал над этой проблемой некоторое время назад (скорее всего, это было основано на комментариях, найденных по этой проблеме, но я не могу вспомнить точные источники).
НОТА:
- Чтобы этот подход работал, вам нужно знать имя хоста /IP-адрес и порт по умолчанию вашего прокси-сервера и соответствующим образом изменить их в коде, если вы подключаетесь к другому прокси-серверу.
- Когда вы не находитесь за прокси-сервером, вам придется отменить примененные изменения, чтобы вернуться в рабочее состояние (если вы хотите доступ к Интернету внутри своего приложения).
Здесь это идет:
Отключите настройки прокси для среды Python (Google App Engine Launcher). (В моем случае это было легко, так как я запускал
dev_appserver.py
из терминальной оболочки (в Linux) иunset http_proxy
а такжеunset https_proxy
Команды сделали свое дело.)редактировать
{App Engine SDK root}/google/appengine/api/urlfetch_stub.py
, Найти блок кодаif _CONNECTION_SUPPORTS_TIMEOUT: connection = connection_class(host, timeout=deadline) else: connection = connection_class(host)
(строки 376-379 в моем случае) и замените его следующим:
if _CONNECTION_SUPPORTS_TIMEOUT: if host[:9] == 'localhost' or host[:9] == '127.0.0.1': connection = connection_class(host, timeout=deadline) else: connection = connection_class('your_proxy_host_goes_here', your_proxy_port_number_goes_here, timeout=deadline) else: if host[:9] == 'localhost' or host[:9] == '127.0.0.1': connection = connection_class(host) else: connection = connection_class('your_proxy_host_goes_here', your_proxy_port_number_goes_here)
замена заполнителей
your_proxy_host_goes_here
а такжеyour_proxy_port_number_goes_here
с соответствующими значениями.(Я полагаю, что этот код может быть написан более элегантно, хотя... какие-нибудь фанаты Python там?:))
В моем случае мне также пришлось удалить существующий скомпилированный файл
urlfetch_stub.pyc
(находится в том же каталоге, что иurlfetch_stub.py
) потому что SDK, похоже, не принимал изменения, пока я не сделал это.
Теперь вы можете использовать dev_appserver
запустить ваше приложение и использовать urlfetch
поддерживаемые сервисы в приложении, без ошибок HTTP 403.