Flask中@app.route与@api.route返回内容差异的原因及修改方法
为什么Flask原生路由返回HTML,而Flask-RESTPlus返回转义字符串?
问题根源
这两者的行为差异核心在于默认响应类型的区别:
- Flask原生的
@app.route视图函数,默认返回的响应Content-Type是text/html。当你返回包含HTML标签的字符串时,浏览器会将其当作HTML内容解析,所以能正常渲染出<h1>这类标签的效果。 - Flask-RESTPlus是专为RESTful API打造的工具,它默认会把响应序列化为JSON格式,
Content-Type为application/json。此时你返回的字符串会被当作JSON的字符串值处理,所有特殊字符(比如<、>)都会被自动转义成<、>,最终浏览器显示的就是转义后的原始字符串。
解决方法(无需Jinja的调整方案)
如果你想让Flask-RESTPlus的接口也返回可被解析的HTML,需要手动构建响应对象并指定正确的Content-Type。可以借助Flask提供的make_response函数实现:
首先导入make_response:
from flask import Flask, request, make_response
然后修改HelloWorld类的get方法:
@api.route('/hello') class HelloWorld(Resource): def get(self): language = request.args.get('language') message = '<h1>Hello world! I speak {}</h1>'.format(language) # 构建响应并指定Content-Type为text/html resp = make_response(message) resp.headers['Content-Type'] = 'text/html' return resp
修改完成后,访问/hello接口时,响应的Content-Type会被设置为text/html,浏览器就会像处理/test1接口一样,正常解析渲染HTML标签了。
小提示:如果你的接口是纯API场景,返回HTML其实不符合RESTful的设计规范,但如果是特殊业务需求,上面的方法完全可以满足你的要求。
内容的提问来源于stack exchange,提问作者David G.
相关产品推荐
相关产品推荐

