从1.7.5更新后(一切正常)我在尝试通过localhost打开任何网站时收到 HTTP错误403:禁止。奇怪的是我在家里的设置几乎和在这里工作一样,一切都在那里工作......可能是我们在工作中使用的代理服务器的问题,因为这是我能想到的唯一区别?这是我得到的错误日志,所以如果有人知道发生了什么,请帮助(;
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.')
答案 0 :(得分:4)
使用Google App Engine Launcher 1.8.6的代理服务器时,我的MacOSX遇到了同样的问题。显然“urllib2.py”上的“proxy_bypass”存在问题。
有两种可能的解决方案:
修改“[GAE Instalattion path] /google/appengine/tools/appengine_rpc.py”并查找显示
的行 opener.add_handler(fancy_urllib.FancyProxyHandler())
在我的计算机中它是第578行,然后在行的开头加上一个哈希(#),如下所示:
`#opener.add_handler(fancy_urllib.FancyProxyHandler())`
保存文件,停止然后重新启动应用程序。现在dev_appserver.py根本不应该尝试使用任何代理服务器。
如果您的应用程序使用任何外部资源(如SOAP Web服务或类似的东西),并且您无法在没有代理服务器的情况下访问服务器,那么您将不得不降级。请记住,外部JavaScript文件(如facebook SDK或类似文件)是从您的浏览器加载的,而不是从您的应用程序加载的。
由于我没有使用任何外部REST或SOAP服务,因此它对我有用!
希望它也适合你。
答案 1 :(得分:1)
尝试: - 通过不同的代理访问它。 I.E a。代理中的代理 - 通过本地IP访问,即192.168.1.1
答案 2 :(得分:0)
我在1.9.5版本遇到了同样的问题。似乎API代理正在向代理服务器发送一些RPC,然后使用HTTP 403拒绝这些RPC(因为代理服务器通常配置为拒绝对任意端口的连接尝试)。在我的情况下,我在我的应用程序中使用urlfetch
模块来访问外部网页,因此禁用代理服务器对我来说不是一个选择。
这是我在一段时间内解决这个问题的方法(很可能是基于this issue下的评论,但我记不清确切的来源了。)
注意:
这就是:
以某种方式禁用Python(Google App Engine Launcher)环境的代理设置。 (在我的情况下,我很容易从终端shell(在Linux上)启动dev_appserver.py
,而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错误。