1.渲染模板和控制结构

2017-09-14  本文已影响0人  郑司令

业务逻辑和表现逻辑

将表现逻辑移到模板中,可以提升程序的可读性。
模板是一个包含响应文本的文件,包含站位变量表示的动态部分。
渲染:使用真实值替换模板中的变量,返回最终得到的响应字符串,这一过程称为渲染。
Flask使用Jinja2作为模板引擎。

简单的两个Jinja2模板:

#templates/index.html:

<h1>Hello World!</h1>
#templates/user.html:

<h1>Hello, {{ name }}!</h1>

程序测试:

from flask import Flask, render_template

app = Flask(__name__)

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

@app.route('/usr/<name>')
def usr(name):
    return render_template('user.html', name = name)


if __name__ == '__main__':
    app.run(host='0.0.0.0',port=5000,debug=True)

可见,render_template的第一个参数是模板的文件名,第二个参数是变量对应的真实值,成为键值对。

谈谈变量:
前面用到的{{ name }}结构表示的变量,是一种特殊的占位符。
Jinja2能识别所有类型的变量,甚至列表、字典和对象。
可以使用过滤器过滤变量:

Hello, {{name|capitalize}}!  #把值的首字母换成大写,其他字母换成小写。

常用的Jinja2变量过滤器。

控制结构:
Jinja2提供了多种控制结构,可以用来改变模板的渲染流程。
几个例子:

#if判断:
{% if usr %}
  Hello,{{ usr }}!
{% else %}
  Hello, Stranger!
{% endif %}

我对这个例子做了一些拓展,可以更好地理解相关内容:

{% if usr == 'Talen' or usr == 'Tale' %}
    Hello,{{ usr }}!
{% else %}
    Hello, Stranger!
{% endif %}

测试程序:

from flask import Flask, render_template

app = Flask(__name__)

@app.route('/if/<usr>')
def index(usr):
    return render_template('if.html',usr = usr)


if __name__ == '__main__':
    app.run(host='0.0.0.0',port=5000,debug=True)

假如传入的是Talen或者Tale,则打印会员;否则打印Stranger。

#for循环:
<ul>
  {% for comment in comments %}
    <li>{{ comment }}</li>
  {% endfor %}
</ul>

测试程序:

#for循环:
<ul>
from flask import Flask, render_template

app = Flask(__name__)

@app.route('/')
def index():
    comments = ['Talen','Tale','Tal']
    return render_template('for.html',comments = comments)


if __name__ == '__main__':
    app.run(host='0.0.0.0',port=5000,debug=True)

宏:
宏相当于一个函数。我们可以将宏保存在一个单独的文件中,从而达到重复使用的目的。

#宏
{% macro comment(comment) %}
    <li> {{comment}} </li>
{% endmacro %}
#调用宏
{% import 'macros.html' as macros %}
<ul>
    {% for comment in comments %}
        {{ macros.comment(comment)}}
    <li> {% endfor %} </li>
</ul>

模板继承,使用flask-bootstrap继承Twitter Bootstrap

#user.html
{% extends "bootstrap/base.html" %} 

{%block title %}Flasky{% endblock %}

{% block navbar %}
    <div class = "navbar navbar-inverse" role = "navigation">
        <div class = "container">
            <div class = "navbar-header">
                <button type = "button" class = "navbar-toggle"
                data-toggle = "collapse" data-target - ".navbar-collapse">
                <span class = "sr-only">Toggle navigation</span>
                <span class = "icon-bar"></span>
                <span class = "icon-bar"></span>
                <span class = "icon-bar"></span>
            </button>
            <a class = "navbar-brand" href = "/">Flasky</a>
        </div>
        <div class = "navbar-collapse collapse">
            <ul class = "nav navbar-nav">
                <li><a href = "/">Home</a></li>
            </ul>
        </div>
    </div>
</div>
{% endblock %}

{% block content %}
<div class = "container">
    <div class = "page-header">
        <h1>Hello, {{ name }}!</h1>
    </div>
</div>
{% endblock %}
from flask import Flask, render_template
from flask.ext.bootstrap import Bootstrap

app = Flask(__name__)

bootstrap = Bootstrap(app)

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

@app.route('/usr/<name>')
def usr(name):
    return render_template('user.html', name = name)


if __name__ == '__main__':

    app.run(host='0.0.0.0',port=5000,debug=True)

虽然html的那些东西看不太懂,但是总算能出个还可以看的东西。
慢慢学吧。

微信图片_20170914224456.png
上一篇 下一篇

猜你喜欢

热点阅读