从内容中获取状态?

2024-04-26 00:48:30 发布

您现在位置:Python中文网/ 问答频道 /正文

下面的函数

print(usaddress.tag('hwy 13 & main st.'))

生成以下结果

(OrderedDict([('StreetNamePreType', u'hwy'), ('StreetName', u'13'), ('IntersectionSeparator', u'&'), ('SecondStreetName', u'main'), ('SecondStreetNamePostType', u'st.')]), 'Intersection')

我对下面的烧瓶返回使用相同的函数

@app.route("/parseAddress", methods=["POST"])
def parseAddress():
  address = request.form['address']
  return usaddress.tag(address)

但是对于HTTP状态,它显示为“intersection”而不是“ok200”,它获取结果的最后一部分并将其用作状态

在不重写正确的状态代码的情况下,返回结果的最佳方法是什么


Tags: 函数mainaddress状态tagordereddictstprint
2条回答

我无法复制您提到的错误,但是,它确实引发以下异常,因为usaddress.tag()返回一个包含OrderedDict的元组

TypeError: 'collections.OrderedDict' object is not callable
The view function did not return a valid response. The return type must be a string, tuple, Response instance, or WSGI callable, but it was a OrderedDict.

您可以通过使用jsonify模块并返回如下JSON响应来修复此问题:

from flask import Flask, jsonify
import usaddress

app = Flask(__name__)

@app.route("/", methods=["Get"])
def parseAddress():
    tagged_address, address_type = usaddress.tag('hwy 13 & main st.')
    return jsonify({"address_type": address_type, "tagged_address": tagged_address})

if __name__ == "__main__":
    app.run(debug=True)

它将在JSON响应之后返回

{
  "address_type": "Intersection", 
  "tagged_address": {
    "IntersectionSeparator": "&", 
    "SecondStreetName": "main", 
    "SecondStreetNamePostType": "st.", 
    "StreetName": "13", 
    "StreetNamePreType": "hwy"
  }
}

你也可以这样做:

@app.route("/", methods=["Get"])
def parseAddress():
    return jsonify(usaddress.tag('hwy 13 & main st.'))

但它将返回一个数组,其中第二个元素是字符串

[
  {
    "IntersectionSeparator": "&", 
    "SecondStreetName": "main", 
    "SecondStreetNamePostType": "st.", 
    "StreetName": "13", 
    "StreetNamePreType": "hwy"
  }, 
  "Intersection"
]

在前端处理起来可能不太方便

希望有帮助

看起来usaddress库正在返回一个包含两个元素的元组,一个OrderedDict和一个string。问题是Flask将返回值解释为(响应、状态)对。尝试return usaddress.tag(address), 200可能会满足您的需要,如果flask足够慷慨,可以将返回值转换为字符串—但一般来说,您需要自己将响应体转换为字符串,然后才能通过HTTP进行传递。JSON是用于此任务的常见序列化格式,因此我建议改为return flask.jsonify(usaddress.tag(address)), 200

如果您真的只想得到文本字符串(OrderedDict([('StreetNamePreType', u'hwy'), ('StreetName', u'13'), ('IntersectionSeparator', u'&'), ('SecondStreetName', u'main'), ('SecondStreetNamePostType', u'st.')]), 'Intersection')作为您的输出,那么您可以使用return str(usaddress.tag(address)), 200作为替代-但是对于查看您的站点的普通开发人员来说,JSON可能会更为熟悉

相关问题 更多 >