Ошибка 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. Понижение до 1.7.5, но кто хочет понизить?
  2. Отредактируйте "[путь установки 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-адрес и порт по умолчанию вашего прокси-сервера и соответствующим образом изменить их в коде, если вы подключаетесь к другому прокси-серверу.
  • Когда вы не находитесь за прокси-сервером, вам придется отменить примененные изменения, чтобы вернуться в рабочее состояние (если вы хотите доступ к Интернету внутри своего приложения).

Здесь это идет:

  1. Отключите настройки прокси для среды Python (Google App Engine Launcher). (В моем случае это было легко, так как я запускал dev_appserver.py из терминальной оболочки (в Linux) и unset http_proxy а также unset https_proxy Команды сделали свое дело.)

  2. редактировать {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 там?:))

  3. В моем случае мне также пришлось удалить существующий скомпилированный файл urlfetch_stub.pyc (находится в том же каталоге, что и urlfetch_stub.py) потому что SDK, похоже, не принимал изменения, пока я не сделал это.

Теперь вы можете использовать dev_appserver запустить ваше приложение и использовать urlfetchподдерживаемые сервисы в приложении, без ошибок HTTP 403.

Другие вопросы по тегам