2015-04-14 116 views
4

我有一个烧瓶服务器上运行在pythonanywhere我试图写一个python脚本,我可以在本地运行这将触发一个特定的响应 - 可以说服务器时间,为了这个讨论。 有关如何编写此过程的Flask服务器端的文档和吨,但如何编写可触发Flask应用程序运行的内容却很少/很少。 我曾尝试以简单的curl命令的形式发送XML,例如POST瓶服务器与Python的XML

curl -X POST -d '<From>Jack</From><Body>Hello, it worked!</Body>' URL 

但是,这似乎并没有工作(有关引荐标题的错误)。

有人可以让我知道正确的方式来编写一些可以发送到监听烧录服务器的XML。

感谢,

杰克

回答

5

首先,我会卷曲调用,这样服务器就知道什么期望添加-H "Content-Type: text/xml"的头。如果您发布了服务器代码(不一定是所有内容,但至少发生了什么问题),这将会很有帮助。

要调试这个我会用

@app.before_request 
def before_request(): 
    if True: 
     print "HEADERS", request.headers 
     print "REQ_path", request.path 
     print "ARGS",request.args 
     print "DATA",request.data 
     print "FORM",request.form 

这是一个有点粗糙,但有助于看看发生了什么事情在每个请求。在调试时根据需要使用if语句打开和关闭它。

在cURL调用中运行没有xml头的请求会将数据发送到request.form字典。添加XML头部定义会导致数据出现在request.data中。不知道你的服务器在哪里出现故障,上面应该至少给你提示如何继续。

编辑指以下评论:

我会用出色的xmltodict库。这种卷曲呼叫

import xmltodict 
@app.before_request 
def before_request(): 
    print xmltodict.parse(request.data)['xml']['From'] 

:使用此测试

curl -X POST -d '<xml><From>Jack</From><Body>Hello, it worked!</Body></xml>' localhost:5000 -H "Content-Type: text/xml" 

'杰克' 打印出来没有问题。

请注意,此调用已从您的问题中修改 - 添加了'xml'标记,因为XML需要根节点(出于某种原因,它被称为xml )。没有这个标签,你会从xmltodict(或你选择的其他解析器)中得到一个解析错误。

+0

好了,所以当我添加的内容类型和before_request叫我回去: REQ_path /测试 ARGS ImmutableMultiDict([]) 数据杰克 FORM ImmutableMultiDict([]) 于是我想我的现在的问题是,我如何从Flask内部获得'name'(我已经尝试了request.data和request.DATA.name等),并且随后将如何通过XML中的ARGS(例如,如果我想要我的服务需要用户名和密码)Cheers @GC_Python – JMzance

+1

@JMzance,请参阅编辑原始答案。 –