如何在Flask中返回json和render_template?

时间:2018-04-03 13:15:17

标签: python html json templates flask

我用Flask在Python中实现了一项服务来创建服务器。我的服务(MyService)从用户处获取查询并返回响应,如聊天机器人。因此,我想返回修改Html模板的文本,以及包含使用服务作为命令行的响应的json。 目前我的服务只返回渲染模板,我该怎么做?

我的应用:

app = Flask(__name__)

@app.route("/")
def main():
    return render_template('index.html')

@app.route("/result", methods=['POST', 'GET'])
def result():
   if request.method == 'POST':
       query = request.form['query']
       response = MyService.retrieve_response(query)
       return render_template("index.html", value=response)

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

我的简单index.html:

<!DOCTYPE html>
<html lang="en">

<body>

<h2>Wellcome!</h2>

<form action="http://localhost:5000/result" method="POST">
  Make a question:<br>
  <br>
  <input type="text" name="query" id="query">
  <br><br>
  <input type="submit" value="submit"/>
</form>


<br>
<h3>Response is: </h3>
<br>
{{value}}
</body>
</html>

2 个答案:

答案 0 :(得分:2)

您可以根据请求类型分出您的回报。如果请求是针对html文本的,请返回render_template。如果请求是针对json的,请返回json。例如:

@app.route("/result", methods=['POST', 'GET'])
def result():
   if request.method == 'POST':
       query = request.form['query']
       response = MyService.retrieve_response(query)
       if request.headers['Content-Type'] == 'application/json':
           return jsonify(...)
       return render_template("index.html", value=response)

答案 1 :(得分:2)

@ dvnguyen的答案很好,但您可以考虑为html和json创建不同的路由。例如:

@app.route("/web/result")
def result_html():
   response = MyService.retrieve_response()
   return render_template("index.html", value=response)

@app.route("/api/result")
def result_json():
   response = MyService.retrieve_response()
   return jsonify(response)

/ api或/ web前缀使意图清晰,并简化了单元测试。