意外的关键字参数'buffering' - python客户端
我遇到了一个错误,提示“getresponse() 收到了一个意外的关键字参数 'buffering'”。完整的错误日志如下:
[INFO ] Kivy v1.8.0
[INFO ] [Logger ] Record log in C:\Users\Sudheer\.kivy\logs\kivy_14-08-15_21.txt
[INFO ] [Factory ] 157 symbols loaded
[DEBUG ] [Cache ] register <kv.lang> with limit=None, timeout=Nones
[DEBUG ] [Cache ] register <kv.image> with limit=None, timeout=60s
[DEBUG ] [Cache ] register <kv.atlas> with limit=None, timeout=Nones
[INFO ] [Image ] Providers: img_tex, img_dds, img_pygame, img_gif (img_pil ignored)
[DEBUG ] [Cache ] register <kv.texture> with limit=1000, timeout=60s
[DEBUG ] [Cache ] register <kv.shader> with limit=1000, timeout=3600s
[DEBUG ] [App ] Loading kv <D:\OS Files\workspace\Assistant\start.kv>
[INFO ] [Text ] Provider: pygame
[DEBUG ] [Cache ] register <kv.loader> with limit=500, timeout=60s
[INFO ] [Loader ] using a thread pool of 2 workers
[DEBUG ] [Cache ] register <textinput.label> with limit=None, timeout=60.0s
[DEBUG ] [Cache ] register <textinput.width> with limit=None, timeout=60.0s
[DEBUG ] [Window ] Ignored <egl_rpi> (import error)
[INFO ] [Window ] Provider: pygame(['window_egl_rpi'] ignored)
[DEBUG ] [Window ] Display driver windib
[DEBUG ] [Window ] Actual window size: 800x600
[DEBUG ] [Window ] Actual color bits r8 g8 b8 a0
[DEBUG ] [Window ] Actual depth bits: 24
[DEBUG ] [Window ] Actual stencil bits: 8
[DEBUG ] [Window ] Actual multisampling samples: 2
GLEW initialization succeeded
[INFO ] [GL ] OpenGL version <b'3.3.0'>
[INFO ] [GL ] OpenGL vendor <b'NVIDIA Corporation'>
[INFO ] [GL ] OpenGL renderer <b'GeForce 9400 GT/PCIe/SSE2'>
[INFO ] [GL ] OpenGL parsed version: 3, 3
[INFO ] [GL ] Shading version <b'3.30 NVIDIA via Cg compiler'>
[INFO ] [GL ] Texture max size <8192>
[INFO ] [GL ] Texture max units <32>
[DEBUG ] [Shader ] Fragment compiled successfully
[DEBUG ] [Shader ] Vertex compiled successfully
[DEBUG ] [ImagePygame ] Load <C:\Kivy180\kivy\kivy\data\glsl\default.png>
[INFO ] [Window ] virtual keyboard not allowed, single mode, not docked
[DEBUG ] [Atlas ] Load <C:\Kivy180\kivy\kivy\data\..\data\images\defaulttheme.atlas>
[DEBUG ] [Atlas ] Need to load 1 images
[DEBUG ] [Atlas ] Load <C:\Kivy180\kivy\kivy\data\..\data\images\defaulttheme-0.png>
[DEBUG ] [ImagePygame ] Load <C:\Kivy180\kivy\kivy\data\..\data\images\defaulttheme-0.png>
[INFO ] [GL ] NPOT texture support is available
[INFO ] [OSC ] using <thread> for socket
[DEBUG ] [Base ] Create provider from mouse
[DEBUG ] [Base ] Create provider from wm_touch
[DEBUG ] [Base ] Create provider from wm_pen
[INFO ] [Base ] Start application main loop
{'DoWorkResult': 'Working'}
http://localhost:9624/BasicServ.svc/auth/Authorize/admin/1234
[INFO ] [Base ] Leaving application in progress...
Traceback (most recent call last):
File "C:\Kivy180\Python33\lib\site-packages\requests-2.2.1-py3.3.egg\requests\packages\urllib3\connectionpool.py", line 313, in _make_request
httplib_response = conn.getresponse(buffering=True)
TypeError: getresponse() got an unexpected keyword argument 'buffering'
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "C:\Kivy180\Python33\lib\site-packages\requests-2.2.1-py3.3.egg\requests\packages\urllib3\connectionpool.py", line 480, in urlopen
body=body, headers=headers)
File "C:\Kivy180\Python33\lib\site-packages\requests-2.2.1-py3.3.egg\requests\packages\urllib3\connectionpool.py", line 315, in _make_request
httplib_response = conn.getresponse()
File "C:\Kivy180\Python33\lib\http\client.py", line 1147, in getresponse
response.begin()
File "C:\Kivy180\Python33\lib\http\client.py", line 358, in begin
version, status, reason = self._read_status()
File "C:\Kivy180\Python33\lib\http\client.py", line 320, in _read_status
line = str(self.fp.readline(_MAXLINE + 1), "iso-8859-1")
File "C:\Kivy180\Python33\lib\socket.py", line 297, in readinto
return self._sock.recv_into(b)
ConnectionResetError: [WinError 10054] An existing connection was forcibly closed by the remote host
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "C:\Kivy180\Python33\lib\site-packages\requests-2.2.1-py3.3.egg\requests\adapters.py", line 330, in send
timeout=timeout
File "C:\Kivy180\Python33\lib\site-packages\requests-2.2.1-py3.3.egg\requests\packages\urllib3\connectionpool.py", line 530, in urlopen
raise MaxRetryError(self, url, e)
requests.packages.urllib3.exceptions.MaxRetryError: HTTPConnectionPool(host='localhost', port=9624): Max retries exceeded with url: /BasicServ.svc/auth/Authorize/admin/1234 (Caused by <class 'ConnectionResetError'>: [WinError 10054] An existing connection was forcibly closed by the remote host)
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "D:\OS Files\workspace\Assistant\main.py", line 10, in <module>
StartApp().run()
File "C:\Kivy180\kivy\kivy\app.py", line 792, in run
runTouchApp()
File "C:\Kivy180\kivy\kivy\base.py", line 481, in runTouchApp
EventLoop.window.mainloop()
File "C:\Kivy180\kivy\kivy\core\window\window_pygame.py", line 381, in mainloop
self._mainloop()
File "C:\Kivy180\kivy\kivy\core\window\window_pygame.py", line 287, in _mainloop
EventLoop.idle()
File "C:\Kivy180\kivy\kivy\base.py", line 324, in idle
self.dispatch_input()
File "C:\Kivy180\kivy\kivy\base.py", line 309, in dispatch_input
post_dispatch_input(*pop(0))
File "C:\Kivy180\kivy\kivy\base.py", line 220, in post_dispatch_input
listener.dispatch('on_motion', etype, me)
File "_event.pyx", line 316, in kivy._event.EventDispatcher.dispatch (kivy\_event.c:4537)
return handler(*largs)
File "C:\Kivy180\kivy\kivy\core\window\__init__.py", line 645, in on_motion
self.dispatch('on_touch_down', me)
File "_event.pyx", line 316, in kivy._event.EventDispatcher.dispatch (kivy\_event.c:4537)
return handler(*largs)
File "C:\Kivy180\kivy\kivy\core\window\__init__.py", line 657, in on_touch_down
if w.dispatch('on_touch_down', touch):
File "_event.pyx", line 316, in kivy._event.EventDispatcher.dispatch (kivy\_event.c:4537)
return handler(*largs)
File "C:\Kivy180\kivy\kivy\uix\widget.py", line 284, in on_touch_down
if child.dispatch('on_touch_down', touch):
File "_event.pyx", line 316, in kivy._event.EventDispatcher.dispatch (kivy\_event.c:4537)
return handler(*largs)
File "C:\Kivy180\kivy\kivy\uix\widget.py", line 284, in on_touch_down
if child.dispatch('on_touch_down', touch):
File "_event.pyx", line 316, in kivy._event.EventDispatcher.dispatch (kivy\_event.c:4537)
return handler(*largs)
File "C:\Kivy180\kivy\kivy\uix\behaviors.py", line 93, in on_touch_down
self.dispatch('on_press')
File "_event.pyx", line 312, in kivy._event.EventDispatcher.dispatch (kivy\_event.c:4491)
if handler(self, *largs):
File "C:\Kivy180\kivy\kivy\lang.py", line 1299, in custom_callback
exec(__kvlang__.co_value, idmap)
File "D:\OS Files\workspace\Assistant\start.kv", line 65, in <module>
on_press: root.Authorization(self,userid.text,password.text)
File "D:\OS Files\workspace\Assistant\forms.py", line 18, in Authorization
if self.loginclass.Authorization()== True:
File "D:\OS Files\workspace\Assistant\classes.py", line 8, in Authorization
return LoginAccess(self.userid, self.password)
File "D:\OS Files\workspace\Assistant\dbcodes.py", line 9, in LoginAccess
response = requests.get('http://localhost:9624/BasicServ.svc/auth/Authorize/'+userid+'/'+password,stream=False)
File "C:\Kivy180\Python33\lib\site-packages\requests-2.2.1-py3.3.egg\requests\api.py", line 55, in get
return request('get', url, **kwargs)
File "C:\Kivy180\Python33\lib\site-packages\requests-2.2.1-py3.3.egg\requests\api.py", line 44, in request
return session.request(method=method, url=url, **kwargs)
File "C:\Kivy180\Python33\lib\site-packages\requests-2.2.1-py3.3.egg\requests\sessions.py", line 383, in request
resp = self.send(prep, **send_kwargs)
File "C:\Kivy180\Python33\lib\site-packages\requests-2.2.1-py3.3.egg\requests\sessions.py", line 486, in send
r = adapter.send(request, **kwargs)
File "C:\Kivy180\Python33\lib\site-packages\requests-2.2.1-py3.3.egg\requests\adapters.py", line 378, in send
raise ConnectionError(e)
requests.exceptions.ConnectionError: HTTPConnectionPool(host='localhost', port=9624): Max retries exceeded with url: /BasicServ.svc/auth/Authorize/admin/1234 (Caused by <class 'ConnectionResetError'>: [WinError 10054] An existing connection was forcibly closed by the remote host)
我相关的 WCF 服务代码是:
<OperationContract()>
<WebGet(UriTemplate:="Authorize/{id}/{pw}", BodyStyle:=WebMessageBodyStyle.Wrapped, RequestFormat:=WebMessageFormat.Json, ResponseFormat:=WebMessageFormat.Json)>
Function Authorize(ByVal id As String, ByVal pw As String)
Function Authorize(ByVal id As String, ByVal pw As String) Implements IBasicServ.Authorize
Dim c As New List(Of Guid)
For i = 0 To 10
c.Add(Guid.NewGuid)
Next
Return c
End Function
在 Python 客户端中的代码是:
import requests
import json
def LoginAccess(userid, password):
response = requests.get('http://localhost:9624/BasicServ.svc/auth/test/')
print (response.json())
print('http://localhost:9624/BasicServ.svc/auth/Authorize/'+userid+'/'+password)
response = requests.get('http://localhost:9624/BasicServ.svc/auth/Authorize/'+userid+'/'+password,stream=False)
print (response.json())
第一个响应只是用来测试服务的,那个是正常工作的,但第二个响应我就收到了错误。我会适当地编写加密和 SSL 的代码,但目前我只是想让这个 REST 客户端正常工作。我也尝试过将 Stream 设置为 True 和 False,但结果都是一样的。
我在网上查了一下,发现这个错误通常和 requests 模块版本太旧有关,但我用的是更新的版本。
请求模块版本是 2.2.1,Python 版本是 3.3,使用 Kivy,WCF 在 .net 4 上。
编辑:
WCF 的 Web 配置文件:
<?xml version="1.0"?>
<configuration>
<system.web>
<compilation debug="true" strict="false" explicit="true" targetFramework="4.0" />
</system.web>
<system.serviceModel>
<services>
<service behaviorConfiguration="ServBehav" name="AssistantWcf.BasicServ">
<endpoint address="auth" behaviorConfiguration="EndBehav" binding="webHttpBinding" name="endpointname" contract="AssistantWcf.IBasicServ" />
</service>
</services>
<behaviors>
<endpointBehaviors>
<behavior name="EndBehav">
<webHttp/>
</behavior>
</endpointBehaviors>
<serviceBehaviors>
<behavior name="ServBehav">
<!-- To avoid disclosing metadata information, set the value below to false before deployment -->
<serviceMetadata httpGetEnabled="true" httpGetBinding="webHttpBinding" httpGetBindingConfiguration="" />
<!-- To receive exception details in faults for debugging purposes, set the value below to true. Set to false before deployment to avoid disclosing exception information -->
<serviceDebug includeExceptionDetailInFaults="false"/>
</behavior>
</serviceBehaviors>
</behaviors>
<serviceHostingEnvironment multipleSiteBindingsEnabled="true" />
</system.serviceModel>
<system.webServer>
<modules runAllManagedModulesForAllRequests="true"/>
<!--
To browse web app root directory during debugging, set the value below to true.
Set to false before deployment to avoid disclosing web app folder information.
-->
<directoryBrowse enabled="true"/>
</system.webServer>
</configuration>
1 个回答
看起来你对Python 3不太熟悉。它引入了一种新的错误追踪方式,这样你可以更好地了解代码执行的路径,从而找到导致程序出错的原因。我们来看看你的错误追踪信息:
Traceback (most recent call last):
File "C:\Kivy180\Python33\lib\site-packages\requests-2.2.1-py3.3.egg\requests\packages\urllib3\connectionpool.py", line 313, in _make_request
httplib_response = conn.getresponse(buffering=True)
TypeError: getresponse() got an unexpected keyword argument 'buffering'
During handling of the above exception, another exception occurred:
这里重要的是最后一行:"在处理上述异常时,发生了另一个异常:" 。这说明TypeError: getresponse() got an unexpected keyword argument 'buffering'
并不是导致你程序停止的根本原因,而是在处理这个错误时又发生了另一个错误。
你会注意到,"在处理上述异常时,发生了另一个异常:" 在你粘贴的输出中出现了几次,最后的追踪信息以以下内容结束:
File "C:\Kivy180\Python33\lib\site-packages\requests-2.2.1-py3.3.egg\requests\adapters.py", line 378, in send
raise ConnectionError(e)
requests.exceptions.ConnectionError: HTTPConnectionPool(host='localhost', port=9624): Max retries exceeded with url:
/BasicServ.svc/auth/Authorize/admin/1234
(Caused by <class 'ConnectionResetError'>:
[WinError 10054] An existing connection was forcibly closed by the remote host)
我把最后一行拆开了,方便阅读(这样就不会横着滚动了)。你看到的这个异常是因为服务器强制关闭了一个已经打开的连接。通常情况下,如果你在使用Session
对象,我会预期会看到这种情况,因为它默认会为你管理连接池,但你现在使用的是函数式API,每次都会创建一个新的Session
对象。这意味着如果这种情况反复发生,服务器很可能出现了问题。服务器拒绝响应你的请求,并强制关闭了建立的连接。在尝试读取响应时,urllib3收到了WinError
异常,而这个异常没有好的恢复方法,只能提供自己的异常ConnectionResetError
。然后,Requests捕获到这个异常并抛出自己的ConnectionError
。
这里的问题似乎不是出在Requests上,而是服务器出现了问题。
顺便提一下,把用户名和密码放在URL里是一个非常糟糕的主意。我建议你考虑使用HTTP摘要认证、HTTP基本认证,或者实现更安全的方案(比如基于令牌的认证方式)。