美文网首页
1.渲染模板和控制结构

1.渲染模板和控制结构

作者: 郑司令 | 来源:发表于2017-09-14 22:46 被阅读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

    相关文章

      网友评论

          本文标题:1.渲染模板和控制结构

          本文链接:https://www.haomeiwen.com/subject/ltkdsxtx.html