Python day42_Flask入门

作者: g_s_007 | 来源:发表于2018-07-05 21:51 被阅读0次

    模板代码复用

    在模板中,可能会遇到以下情况:

    • 多个模板具有完全相同的顶部和底部内容
    • 多个模板中具有相同的模板代码内容,但是内容中部分值不一样
    • 多个模板中具有完全相同的 html 代码块内容

    像遇到这种情况,可以使用 JinJa2 模板中的 宏、继承、包含来进行实现

    包含

    包含(Include):它的功能是将另一个模板整个加载到当前模板中,并直接渲染

    上代码:

    Python部分:
    
    @app.route('/index4')
    def index4():
        return render_template('04_index.html')
    
    04_index.html 部分
    
    <p>这是一个p标签</p>
    <p>包含在使用时,如果包含的模板文件不存在时,
        程序会抛出TemplateNotFound异常,
        可以加上 ignore missing 关键字。
        如果包含的模板文件不存在,
        会忽略这条include语句</p>
    # include.html 将要加载过来的html文件
    {% include 'include.html' ignore missing %}
    <p>这是第二个p标签</p>
    </body>
    
    include.html部分
    
    <body>
        <ul>
            <li>列表1</li>
            <li>列表2</li>
            <li>列表3</li>
            <li>列表4</li>
        </ul>
    </body>
    

    模板继承

    模板继承是为了重用模板中的公共内容。一般Web开发中,继承主要使用在网站的顶部菜单、底部。这些内容可以定义在父模板中,子模板直接继承,而不需要重复书写。

    • 相当于在父模板中占个位置,当子模板继承父模板时,可以进行填充。
    • 子模板使用 extends 指令声明这个模板继承自哪个模板
    • 父模板中定义的块在子模板中被重新定义,在子模板中调用父模板的内容可以使用super()

    实例:

    python部分:
    
    @app.route('/index2')
    def index2():
        return render_template('02_index.html')
    
    
    父模板部分:base.html
    
    <p>这是网页顶部内容</p>
    # 用block 占位 用center(可以任意起名) 声明这段内容
    {% block center %}
        <p>这是父模板的中间内容</p>
    {% endblock %}
    <p>这是网页底部内容</p>
    
    字模板部分:02_index.html
    
    <body>
    # 用extends 声明这个模板继承自哪个html文件
    {% extends 'base.html' %}
    # 用block重写 center 这段的内容,如果想要父类内容,用super()继承
    {% block center %}
        {{ super() }}
        <p>这是子模板的中间部分</p>
    {% endblock %}
    </body>
    

    宏(macro):

    • 把它看作 Jinja2 中的一个函数,它会返回一个模板或者 HTML 字符串
    • 为了避免反复地编写同样的模板代码,出现代码冗余,可以把他们写成函数以进行重用
    • 需要在多处重复使用的模板代码片段可以写入单独的文件,再包含在所有模板中,以避免重复

    实例:

    #在macro.html中定义一个form表单 input函数
    
    
    {% macro input(label = "",type = "text",name = "",value = "") %}
         <label>{{ label }}</label><input type="{{ type }}" name="{{ name }}" value="{{ value }}"><br/>
    {% endmacro %}
    
    #在06_index.html中引入macro.html
    
    {% import 'macro.html' as func %}
    
    #在06_index.html中使用模板
    
    <form>
        {{ func.input('用户名:',name='username') }}
        {{func.input('身份证号:',name='idcard') }}
    {{ func.input('密码:',type="password",name='password') }}
        {{ func.input('确认密码:',type="password" ,name="password2") }}
        {{ func.input(type="submit",value="注册") }}
    </form>
    
    #python 部分:
        
    @app.route('/index6')
    def index6():
        return render_template('06_index.html')
    

    模板中特有的变量和函数

    • config

    • request

    • session

    • g变量

    • url_for()

    • get_flashed_messages()

        html 部分:
        
        <body>
        {{ config['DEBUG']}} <br>
        {{ config }} <br>
        {{ url_for }} <br>
        {{ request }} <br>
        {#url_root: url_root: http://127.0.0.1:5000/ #}
        {{ request.url_root }} <br>
        {#url_rule: url_rule: /index7 #}
        {{ request.url_rule }} <br>
        {#url: url: http://127.0.0.1:5000/index7 #}
        {{ request.url }} <br>
        {{ session.get('name') }} <br>
        {#g变量的name :#}
        {{ g.name }} <br>
        #url_for会根据传入的路由器函数名,返回该路由对应的URL
        #在模板中始终使用url_for()就可以安全的修改路由绑定的URL
        #不比担心模板中渲染出错的链接
        <a href="{{ url_for('log',mobile = 123) }}">登录</a> <br>
        {#获取闪现消息:#}
        {% for message in get_flashed_messages() %}
        {{ message }}
        {% endfor %}
        
        </body>
        
        Python部分:
        # 需要导入模块:g,session,flash
        @app.route('/index7')
        def index7():
        g.name = 'lisi'
        return render_template('07_index.html')
        app.secret_key = 'wangwu'
        # 要获得session 的值 首先需要设置session的值
        @app.route('/set_session')
        def set_seesion():
        session['name'] = 'zhangsan'
        return 'set session'
        
        @app.route('/login/<int:mobile>')
        def log(mobile):
        return 'login: %s' % mobile
        # 使用闪现消息的时候必须要添加秘钥 app.secret_key 
        # 因为flash会往session里面存取
        @app.route('/set_flash')
        def set_flash():
        flash('这是闪现消息')
        return 'set_flash'
      

    web表单

    Web 表单是 Web 应用程序的基本功能。

    它是HTML页面中负责数据采集的部件。表单有三个部分组成:表单标签、表单域、表单按钮。表单允许用户输入数据,负责HTML页面数据采集,通过表单将用户输入的数据提交给服务器。

    在Flask中,为了处理web表单,我们可以使用 Flask-WTF 扩展,它封装了 WTForms,并且它有验证表单数据的功能

    08.JPG 09.JPG

    使用 Flask-WTF 需要配置参数 SECRET_KEY。

    CSRF_ENABLED是为了CSRF(跨站请求伪造)保护。 SECRET_KEY用来生成加密令牌,当CSRF激活的时候,该设置会根据设置的密匙生成加密令牌。

    相关文章

      网友评论

        本文标题:Python day42_Flask入门

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