使用Flask-Restful返回呈现的模板在浏览器中显示HTML

时间:2013-10-11 10:11:11

标签: python flask jinja2

我是Python和Flask的新手。我在我的应用程序的根目录中有一个模板文件夹,它有两个文件。

<!DOCTYPE html>
   <html lang="en">
   <head>
     <title>{% block title %}{% endblock title %}</title>

     <link href="http://netdna.bootstrapcdn.com/bootswatch/2.3.2/united/bootstrap.min.css" rel="stylesheet">
     <link href="http://netdna.bootstrapcdn.com/twitter-bootstrap/2.3.2/css/ bootstrap-responsive.min.css" rel="stylesheet">
     <script src="http://code.jquery.com/jquery-1.9.1.min.js"></script>
     <script src="http://netdna.bootstrapcdn.com/twitter-bootstrap/2.3.2/js/bootstrap.min.js"></script>
</head>
<body>
  <div id="main">
    <div class="utility-nav navbar navbar-fixed-top">
    <div class="navbar-inner">
    <div class="container">
      {# Navbar goes here. #}
    </div>
   </div>
  </div>
  <div class="content container">
    {% block main %}{% endblock main %}
  </div>
  </div>
</body>
</html>

{% extends 'base.html' %}
{% block title %}Page Title{% endblock title %}
{% block main %}
    <h2>This is a child template.</h2>
{% endblock main %}

然后我有以下功能

from flask.ext.restful import Resource,request,reqparse
from app.business.login import Login
from app.business.appointments import Appointments 
from app.models.models import User, Address,Appointment
from flask import render_template
    class AppointmentController(Resource):
        def __init__(self):
            pass
        def get(self):
        return render_template('index.html')

所以当我启动服务器并说http://0.0.0.0:5000/appointment我得到

"<!DOCTYPE html>\n   <html lang=\"en\">\n   <head>\n     <title>Page Title</title>\n    \n     <link href=\"http://netdna.bootstrapcdn.com/bootswatch/2.3.2/united/bootstrap.min.css\" rel=\"stylesheet\">\n     <link href=\"http://netdna.bootstrapcdn.com/twitter-bootstrap/2.3.2/css/ bootstrap-responsive.min.css\" rel=\"stylesheet\">\n     <script src=\"http://code.jquery.com/jquery-1.9.1.min.js\"></script>\n     <script src=\"http://netdna.bootstrapcdn.com/twitter-bootstrap/2.3.2/js/bootstrap.min.js\"></script>\n</head>\n<body>\n  <div id=\"main\">\n    <div class=\"utility-nav navbar navbar-fixed-top\">\n    <div class=\"navbar-inner\">\n    <div class=\"container\">\n      \n    </div>\n   </div>\n  </div>\n  <div class=\"content container\">\n    \n\t<h2>This is a child template.</h2>\n\n  </div>\n  </div>\n</body>\n</html>"

表示模板正在运行,但浏览器将响应视为字符串而不是html。我究竟做错了什么。

2 个答案:

答案 0 :(得分:20)

我相应地修改了get。设置内容类型就可以了。

from flask import render_template, make_response

class AppointmentController(Resource):
    def __init__(self):
        pass
    def get(self):
        headers = {'Content-Type': 'text/html'}
        return make_response(render_template('index.html'),200,headers)

答案 1 :(得分:3)

解决方案-

def get(self):
    #headers = {'Content-Type': 'text/html'}
    #return make_response(render_template('login.html'), 200, headers)
    # or just                                                                                        
    return make_response(render_template('index.html'))

# or 

def get(self):
    #return Response(response=render_template('index.html'), status=200, mimetype="text/html")
    # or just
    return Response(response=render_template('index.html'))

说明-

“ render_template”函数通常返回呈现的模板文件的字符串输出。

Flask为每个请求创建响应对象。 Flask的应用程序实例具有make_response()函数,该函数从route函数获取返回值,并使用它们填充Response对象。

或者我们可以显式地返回Response类对象,如第二个示例所示。

如果由于这个原因未明确提供响应类,则它具有一些默认属性,在上述示例中,我们可以跳过状态和标头参数。 响应类看起来像

class Response(BaseResponse):
   status = 200
   mimetype = "text/html"