赞
踩
思考 : 网站如何向客户端返回一个漂亮的页面呢?
提示 ::
- 漂亮的页面需要 html 、 css 、 js .
- 可以把这一堆字段串全都写到视图中, 作为 HttpResponse() 的参数,响应给客户端
问题:
解决问题:
使用模板 Template
MVT 设计模式中的 T , Template
业务请求流程图展示:
模板使用考虑的问题?响应模板,模板目录,设置模板目录。
在 Flask中,配套的模板是 Jinja2,Jinja2的作者也是Flask的作者。
这个模板非常的强大,并且执行效率高。
1、创建模板
2、设置模板查找路径
3、模板处理数据
Flask渲染Jinja2模板,通过render_template方法来渲染一个模板。
示例代码:
- from flask import Flask, render_template
-
- app = Flask(__name__)
-
-
- @app.route('/index')
- def index():
- return render_template('index.html')
-
-
- if __name__ == '__main__':
- app.run()
运行结果:
注意:上面代码写法存在问题,url不能写成/index/
示例代码:
- from flask import Flask, render_template
-
- app = Flask(__name__)
-
-
- @app.route('/')
- def index():
- return render_template('index.html')
-
-
- if __name__ == '__main__':
- app.run()
运行结果:
当访问/的时候,index()函数会在当前目录下的templates文件夹下寻找index.html模板文件。如果想更改模板文件地址,应该在创建app的时候,给Flask传递一个关键字参数template_folder,指定具体的路径,如下面代码所示:
- from flask import Flask, render_template
-
- app = Flask(__name__, template_folder='C:\data\templates')
-
-
- @app.route('/')
- def index():
- return render_template('index.html')
-
-
- if __name__ == '__main__':
- app.run()
上面代码中将会把模板文件的路径修改为了C盘中的data/template中。建议使用相对路径!
在使用 render_template 渲染模版的时候,可以传递关键字参数(命名参数)。
示例代码:
main.py
- from flask import Flask, render_template
-
- app = Flask(__name__)
-
-
- @app.route('/')
- def index():
- content = {
- "name": 'dgw',
- "age": 25,
- "sex": '男'
- }
- # return render_template('index.html', name=content['name'], age=content['age'], sex=content['sex'])
- return render_template('index.html', **content)
-
-
- if __name__ == '__main__':
- app.run()
index.html
- <!DOCTYPE html>
- <html lang="en">
- <head>
- <meta charset="UTF-8">
- <title>首页</title>
- </head>
- <body>
- 欢迎来到首页!
- <div>
- name:{{ name }} <br>
- sex:{{ sex }} <br>
- age:{{ age }} <br>
- </div>
- </body>
- </html>
运行结果:
render_template需要传递的是一个关键字参数,当参数过多时可以使用字典进行包装,并且加两个*号,来转换成关键字参数。
关于Jinja2中更多参数的传递方式,如下示例代码所示:
main.py
- from flask import Flask, render_template
-
- app = Flask(__name__)
-
-
- @app.route('/')
- def index():
- content = {
- "names": {"name": 'dgw'},
- "age": 25,
- "sex": '男'
- }
- name_list = ['张三', '李四', '王五']
- return render_template('index.html', **content, name_list=name_list)
-
-
- if __name__ == '__main__':
- app.run()
index.html
- <!DOCTYPE html>
- <html lang="en">
- <head>
- <meta charset="UTF-8">
- <title>首页</title>
- </head>
- <body>
- 欢迎来到首页!
- <div>
- names:{{ names.name }} <br>
- names:{{ names['name'] }} <br>
- sex:{{ sex }} <br>
- age:{{ age }} <br>
-
- {# personal info #}
- </div>
- <div>
- <ul>
- {% for name in name_list %}
- <li>{{ name }}</li>
- {% endfor %}
- </ul>
- </div>
- </body>
- </html>
运行结果:
小技巧:
如果你的参数项过多,那么可以将所有的参数放到一个字典中,然后在传这个字典参数的时候,使用两个星号,将字典打散成关键字参数(也叫命名参数)。
模板文件中获取参数的方式:
获取方式是: {{childrens.name}} 或者 {{childrens['name']}}
关于模板中这种使用:foo.bar,那么在Jinja2中是这样进行访问的:
关于模板中这种使用:foo['bar'],那么在Jinja2中是这样进行访问:
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。