python3.5 aiohttp,请求发布,json格式和405错误

时间:2015-12-15 08:50:58

标签: javascript python json aiohttp

我终于注册了,因为我对我的问题不再了解。 我使用asyncio和aiohttp作为后端部分,javascript作为前端部分。但我坚持405错误。 (我确切地说,我是这些图书馆的初学者)

我希望从帖子请求中检索一个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错误。这里有一个关于请求的萤火虫的说法:

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的对象,我不明白如何使用函数{{1来自json() package(here)。

我真的需要一个json对象。有人可以帮帮我吗?

2 个答案:

答案 0 :(得分:4)

我找到了解决方案。我在这里发布可能感兴趣的人的结论:

python side:

替换行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)

有了这个,我的方法有效。

答案 1 :(得分:1)

你的例子很好,除了两件事:

  1. @asyncio.coroutineasync with互为排斥
  2. postJson()必须返回响应实例,而不是None