python3.5 aiohttp,请求post,json格式和405错误
python3.5 aiohttp, request post, json format and 405 errors
我终于注册了,因为我对我的问题没有更多的想法。
我的后端部分使用 asyncio 和 aiohttp,前端部分使用 javascript。但是我遇到了 405 错误。 (准确地说,我是这些库的初学者)
我希望从 post 请求中检索 json。这里的 javascript 函数:
function postJson (data){
$.ajax({
url : 'http://localhost:8080/postJson',
type : 'POST',
dataType : 'json',
contentType : 'application/json',
data : data, //data are ready at json format, I do not think I need to use JSON.stringify ? I does not change anything to the error anywhere
success : function(code_html, statut){
console.log("success POST");
},
error : function(resultat, statut, erreur){
console.log("error POST");
}
});
}
和python代码:
async def postJson(request):
data = await request.post()
#some code
return Response()
@asyncio.coroutine
def init(loop):
app = Application(loop=loop)
app.router.add_route('POST', '/postJson', postJson)
handler = app.make_handler()
srv = yield from loop.create_server(handler, '127.0.0.1', 8080)
print("Server started at http://127.0.0.1:8080")
return srv, handler
loop = asyncio.get_event_loop()
srv, handler = loop.run_until_complete(init(loop))
try:
loop.run_forever()
except KeyboardInterrupt:
loop.run_until_complete(handler.finish_connections())
使用此代码,我收到 405 错误。这里有一些关于请求的 firebug 内容:
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 // so json is not in the list.
但是,如果我在我的 javascript 文件中取回 contentType : 'application/json'
行,它会起作用(但是请求发送一个名为 MultiDictProxy
的对象,我不明白如何使用 aiohttp.web
包 (here) 中的函数 json()
。
我真的需要得到一个 json 对象。有人可以帮助我吗?
除了两点,您的示例工作正常:
@asyncio.coroutine
和async with
互斥
postJson()
必须 return 响应实例,而不是 None
我找到了解决办法。我post这里的结论对于可能感兴趣的人:
python 边:
将行 app.router.add_route('POST', '/postJson', postConf)
替换为
app.router.add_route('POST', '/postJson', postConf, expect_handler = aiohttp.web.Request.json)
在postJson方法中:
将data = await request.post()
替换为data = await request.json()
javascript 一侧:
data : JSON.stringify(data)
有了这个,我的方法就奏效了。
我终于注册了,因为我对我的问题没有更多的想法。 我的后端部分使用 asyncio 和 aiohttp,前端部分使用 javascript。但是我遇到了 405 错误。 (准确地说,我是这些库的初学者)
我希望从 post 请求中检索 json。这里的 javascript 函数:
function postJson (data){
$.ajax({
url : 'http://localhost:8080/postJson',
type : 'POST',
dataType : 'json',
contentType : 'application/json',
data : data, //data are ready at json format, I do not think I need to use JSON.stringify ? I does not change anything to the error anywhere
success : function(code_html, statut){
console.log("success POST");
},
error : function(resultat, statut, erreur){
console.log("error POST");
}
});
}
和python代码:
async def postJson(request):
data = await request.post()
#some code
return Response()
@asyncio.coroutine
def init(loop):
app = Application(loop=loop)
app.router.add_route('POST', '/postJson', postJson)
handler = app.make_handler()
srv = yield from loop.create_server(handler, '127.0.0.1', 8080)
print("Server started at http://127.0.0.1:8080")
return srv, handler
loop = asyncio.get_event_loop()
srv, handler = loop.run_until_complete(init(loop))
try:
loop.run_forever()
except KeyboardInterrupt:
loop.run_until_complete(handler.finish_connections())
使用此代码,我收到 405 错误。这里有一些关于请求的 firebug 内容:
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 // so json is not in the list.
但是,如果我在我的 javascript 文件中取回 contentType : 'application/json'
行,它会起作用(但是请求发送一个名为 MultiDictProxy
的对象,我不明白如何使用 aiohttp.web
包 (here) 中的函数 json()
。
我真的需要得到一个 json 对象。有人可以帮助我吗?
除了两点,您的示例工作正常:
@asyncio.coroutine
和async with
互斥postJson()
必须 return 响应实例,而不是None
我找到了解决办法。我post这里的结论对于可能感兴趣的人:
python 边:
将行 app.router.add_route('POST', '/postJson', postConf)
替换为
app.router.add_route('POST', '/postJson', postConf, expect_handler = aiohttp.web.Request.json)
在postJson方法中:
将data = await request.post()
替换为data = await request.json()
javascript 一侧:
data : JSON.stringify(data)
有了这个,我的方法就奏效了。