什么是Django的render_to_string函数的Flask版本?

时间:2015-05-06 00:46:05

标签: python django flask tdd render-to-string

所以,我正在尝试通过将this代码翻译成Flask来学习Flask的TDD。我一直试图找到如何将模板渲染到字符串一段时间。这是我尝试过的:

render_template(...)
render_template_string(...)
make_response(render_template(...)).data

并且它们似乎都不起作用。

每种情况下的错误似乎都是

"...templating.py", line 126, in render_template
    ctx.app.update_template_context(context)
AttributeError: 'NoneType' object has no attribute 'app'

templating.py的{​​{1}}函数中。

我的测试代码如下:

render_template

def test_home_page_can_save_POST_request(self): with lists.app.test_client() as c: c.get('/') rv = c.post('/', data = {'item_text':"A new list item"}) # This test works self.assertIn("A new list item", rv.data) # This test doesn't self.assertEqual(rv.data,flask.make_response(flask.render_template('home.html',new_item_text='A new list item')).data) 如下:

home.html

编辑:我添加了更多文件,因为错误可能与使用的实际功能无关。我正在使用Celeo在答案中建议的内容。

2 个答案:

答案 0 :(得分:1)

您使用make_response

走在正确的道路上
response = make_response(render_template_string('<h2>{{ message }}</h2>', message='hello world'))

然后,

response.data

<h2>hello world</h2>

response对象已记录在案here

答案 1 :(得分:1)

Celeo是正确的,但还有两件事要考虑(其中一个是render_template函数特有的):

首先,您修改后的函数看起来有缩进问题。看起来你正在&#34;以及#34;之外调用rv.data。声明。 &#34;断言等于&#34;语句应该与&#34; assertIn&#34;在同一个块/缩进级别内。声明。 (看起来你现在已经把它放在了街区之外。)

第二 - 更重要的是 - flask中的render_template函数在输出的HTML的开头和结尾添加换行符。 (您可以通过将以下命令打印到stdout:

来从python交互式shell验证这一点
flask.render_template('home.html',new_item_text='A new list item').data  # adds '\n' at start & end

您将获得的输出将在输出的开头和结尾处添加换行符(&#34; \ n&#34;)。

因此,您应该尝试使用strip()函数剥离输出,如下所示:

def test_home_page_can_save_POST_request(self):
    with lists.app.test_client() as c:
        c.get('/')
        rv = c.post('/', data = {'item_text':"A new list item"})

        self.assertIn("A new list item", rv.data)

        # Suggested Revision
        self.assertEqual(rv.data,flask.make_response(flask.render_template('home.html',new_item_text='A new list item')).data.strip())

这应该有希望做到这一点。