模板

作者: 垃圾桶边的狗 | 来源:发表于2019-03-17 18:25 被阅读0次

Day2 模板

一、flask-script扩展库

概述:

是一个flask终端运行解析器 因为在代码写完以后 就不需要有任何的修改 因为任何的修改都有可能带来风险 所有我们要在终端通过不同参数 来进行项目的启动

安装

pip3 install flask-script

导入

from flask import Flask
#导入终端运行解析器
from flask_script import Manager
app = Flask(__name__)
manager = Manager(app) #对类进行实例化

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

if __name__ == '__main__':
    # app.run(debug=True)
    manager.run()

参数

在终端输入

python3 manage.py runserver -?

参数 说明
-h 主机
-p 端口
-d 调试debug
-r 重新加载reload
--threaded 开启多线程

完整的启动

python3 manage.py runserver -h0.0.0.0 -p5000 -d -r --threaded

python3 manage.py -d -r

二、蓝本 blueprint

概述

当我们项目的代码越来越多的时候 所有的代码都放在一个文件中 很明显是不合理的 我们要按照模块功能进行划分 蓝本就是为了解决这个问题而出现的

使用:

user.py

from flask import Blueprint #导入蓝本

user = Blueprint('user',__name__) #实例化蓝本  括号里面的user为当前蓝本名称

@user.route('/login/')
def login():
    return 'login'

manage.py 注册蓝本

from user import user #导入蓝本对象 user
# app.register_blueprint(user) #注册蓝本对象
app.register_blueprint(user,url_prefix='/user') #注册蓝本对象

current_app:

全局能够访问并且拿到 flask的公共配置信息

模板

一、模板引擎概念

模板文件 就是按照一定的规则 书写的一个负责页面展示效果的替换规则

Jinja2:

是由flask核心成员负责开发的 flask使用的模板引擎为Jinja2

二、模板创建使用

目录层级

project/
    manage.py
    templates/

(1) 渲染模板

导入:

from flask import render_template,render_template_string

  • 渲染模板
    render_template()
  • 渲染一段简短的html内容
    render_template_string()

实例

@temtest.route('/test/')
def test():
    return render_template_string('<p style="border:1px solid red;color:blue;">render_template_string</p>')
    return render_template('index.html')

(2) 变量

格式:

{{ 变量名称 }}

使用:

  1. 变量就是视图函数传递给模板的数据
  2. 变量要遵循标识符的命名规则
  3. 如果模板中的变量不存在 则插入空字符串(什么都没有)

实例

return render_template('index.html',title='我是页面标题')

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>{{ title }}</title>
</head>
<body>
<h2>首页</h2>
<h3>{{ notdefind }}</h3>
</body>
</html>

(3) 标签

格式

{% 标签名称 %}

  1. if

格式

{% if value %}
{% elif value %}
{% else %}
{% endif %}
  1. for

格式

{% for v in value %}
    ...
{% else %}
    ...
{% endfor %}

实例

{#{% for v in title %}#}
{% for v in notdefind %}
    <li>{{ v }}</li>
{% else %}
    <li>当迭代的变量不存在则执行else(也就是django的empty)</li>
{% endfor %}

迭代字典

实例

{#{% for k in Dict %}#}
{% for k,v in Dict.items() %}
    <li>{{ k }}==>{{ v }}</li>
{% endfor %}

注意:

在django里 items是属性 在flask里是方法

迭代序列

{% for i in range(10) %}
    <li>{{ i }}</li>
{% endfor %}

获取迭代状态

变量 说明
loop.index 获取当前迭代的索引 从1开始
loop.index0 获取当前迭代的索引 从0开始
loop.first 是否为第一次迭代
loop.last 是否为最后一次迭代
loop.length 迭代的长度

  1. 注释

多行注释

{# 注释内容 #}

三、文件包含 include

使用include语句 把一个模板整体包含到另外的一个模板中 实现代码的复用 就三相当于把一个模板的代码拷贝到了你的include的位置

testinclude.html

<!doctype html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
</head>
<body>
testinclude.html
</body>
</html>

index.html

<!doctype html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
</head>
<body>
{% include 'common/testinclude.html' %}
</body>
</html>

注意:

我们的index里面就会有俩个主体结构标签 这样是不符合html的语法规则 证明了 include会将一个模板的所有代码 都拷贝到include的代码的位置

四、模板继承 extends

组成

  1. extends 继承父模板
  2. block 对模板进行留出替换的余地
  3. {{ super() }} 对替换掉的模板代码 在次调用回来就是django中的{{ block.super }}

base.html

{% block doc %}
<!DOCTYPE html>
<html lang="en">
<head>
    {% block head %}
        {% block meta %}
            <meta charset="UTF-8">
        {% endblock %}
        <title>{% block title %}title{% endblock %}</title>
        {% block styles %}
        {% endblock %}
        {% block link %}
        {% endblock %}
        {% block script %}
        {% endblock %}
    {% endblock %}
</head>
<body>
{% block body %}
    <h2>base的代码</h2>
{% endblock %}
</body>
</html>
{% endblock %}

testextends,html

{% extends 'common/base.html' %}
{% block title %}
    测试模板页面
{% endblock %}
{% block body %}
    测试模板页面
        {{ super() }}
    阿三大赛的<font color="aqua">阿斯顿阿</font>斯顿
{% endblock %}

五、macro 宏

定义

{% macro 宏的名称([可选参数]) %}
    ...代码块
{% endmacro %}

宏的使用

{{ 宏的名称([可选的实参]) }}

实例

{% macro form(context="",type="text",name="",value="",placeholder="",minlength=6,maxlength=12) %}
    <p>{{ context }}<input type="{{ type }}" name="{{ name }}" value="{{ value }}" maxlength="{{ maxlength }}" minlength="{{ minlength }}" placeholder="{{ placeholder }}"></p>
{% endmacro %}

<form action="" method="post">
    {{ form('用户名: ',name="username",placeholder='请输入用户名') }}
    {{ form('密码: ','password','userpass',placeholder='请输入密码') }}
    {{ form('','submit',value='submit') }}
</form>

宏的导入

common/formmacro.html

{% from 'common/formmacro.html' import form %}
{% from 'common/formmacro.html' import form as myForm %}
{% import 'common/formmacro.html' as myForm %}
<form action="" method="post">
    {{ myForm.form('用户名: ',name="username",placeholder='请输入用户名') }}
    {{ myForm.form('密码: ','password','userpass',placeholder='请输入密码') }}
    {{ myForm.form('','submit',value='submit') }}
</form>

注意:

  1. 宏的定义和函数一样 只能在宏定义的下方去调用
  2. 如果宏有形参 且没有 默认值 则可以不传实参 则形参值为空字符
  3. 如果宏有形参且有默认值 调用不传实参 则形参的值为默认值
  4. 如果宏有形参且有默认值 调用传实参 则形参的值为实参的值
  5. 可以给关键字参数 指定形参名给值
  6. 形参在定义的时候 要遵循默认值的规则 也就是 有形参默认值的放在右侧 没有的放在左侧

六、flask-bootstrap

安装:

pip3 install flask-bootstrap

使用

from flask_bootstrap import Bootstrap
app = Flask(__name__)
bootstrap = Bootstrap(app) #实例化Bootstrap

制定bootstrap多的base

{% extends 'bootstrap/base.html' %}
{% block navbar %}
<nav class="navbar navbar-inverse" style="border-radius: 0;">
  <div class="container-fluid">
    <!-- Brand and toggle get grouped for better mobile display -->
    <div class="navbar-header">
      <button type="button" class="navbar-toggle collapsed" data-toggle="collapse" data-target="#bs-example-navbar-collapse-1" aria-expanded="false">
        <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="#">Brand</a>
    </div>

    <!-- Collect the nav links, forms, and other content for toggling -->
    <div class="collapse navbar-collapse" id="bs-example-navbar-collapse-1">
      <ul class="nav navbar-nav">
        <li class="active"><a href="#">首页 <span class="sr-only">(current)</span></a></li>
        <li><a href="#">发表博客</a></li>
      </ul>

      <ul class="nav navbar-nav navbar-right">
          <form class="navbar-form navbar-left">
        <div class="form-group">
          <input type="text" class="form-control" placeholder="Search">
        </div>
        <button type="submit" class="btn btn-default">搜索</button>
      </form>
        <li><a href="#">登录</a></li>
        <li><a href="#">注册</a></li>
        <li class="dropdown">
          <a href="#" class="dropdown-toggle" data-toggle="dropdown" role="button" aria-haspopup="true" aria-expanded="false">个人中心 <span class="caret"></span></a>
          <ul class="dropdown-menu">
            <li><a href="#">修改用户名</a></li>
            <li><a href="#">修改密码</a></li>
            <li><a href="#">上传头像</a></li>
            <li role="separator" class="divider"></li>
            <li><a href="#">退出登录</a></li>
          </ul>
        </li>
      </ul>
    </div><!-- /.navbar-collapse -->
  </div><!-- /.container-fluid -->
</nav>
{% endblock %}
{% block content %}
<div class="container">
  {% block pagecontent %}
      <h2>这是我们自己定义的base 以后所有的子模板都继承我就好</h2>
  {% endblock %}
</div>
{% endblock %}

制定错误模板

manage.py

@app.errorhandler(404)
def page_not_found(err):
    return render_template('error.html',title='404 PAGE_NOT_FOUND',info=err,con='页面被外星人抓走了')

@app.errorhandler(500)
def server_error(err):
    return render_template('error.html',title='500 SERVER_ERROR',info=err,con='您的访问太热情了 请稍候在尝试访问')

error.html

{% extends 'common/boot_base.html' %}
{% block title %}
    {{ title }}
{% endblock %}
{% block pagecontent %}
<div class="alert alert-danger alert-dismissible" role="alert">
  <button type="button" class="close" data-dismiss="alert" aria-label="Close"><span aria-hidden="true">&times;</span></button>
  <strong>{{ con }}</strong>{{ info }}
</div>
{% endblock %}
{# 根据404和500对应显示出友好的图片的展示 #}

七、视图函数传递多个参数渲染模板的方法

(1) 原始办法 关键字参数

def page_not_found(err):
    return render_template('error.html',title='404 PAGE_NOT_FOUND',info=err,con='页面被外星人抓走了')

(2) locals()

def index():
    a = 'a'
    b = 'b'
    print(locals()) #{'a':'a','b':'b'}
    # return 'index'
    return render_template('index.html',**locals())

(3) 使用字典方式

def index():
    return render_template('index.html',**{'a':'a','b':'b'})

(4) 全局变量g 作为一个完整请求数据的存储

导入g

from flask import g

def index():
    g.a = 'a'
    g.b = 'b'
    return render_template('index.html')

八、加载静态资源

新建资源目录static

目录结构

project/
    static/
        img/
            abc.jpeg
    templates/

实例

<img src="{{ url_for('static',filename='img/abc.jpeg',_external=True) }}" alt="">

相关文章

  • 领导力培训和发展行业的电子学习模板

    模板一: 模板二: 模板三: 模板四: 模板五: 模板六: 模板七: 模板八: 模板九: 模板十: 模板十一: 模...

  • 有了这套画册模板设计之路不再迷茫!超赞!

    indesign模板介绍 时尚写真画册模板、婚礼画册模板、摄影写真画册模板、 人物展示画册模板、服装展示画册模板;...

  • 08_模板层补充

    模板层 一、模板层导入与继承 模板导入: 先码一个好看的模板 语法:{% include '模板名称' %} 模板...

  • 《PHP Learning》模板引擎

    《PHP Learning》模板引擎 模板处理使用正则处理模板替换规则保存模板编译结果 模板使用 自定义模板引擎 ...

  • C++模板编程/泛型编程

    模板分类 模板分为函数模板与类模板两类。 函数模板 模板声明 模板定义 例如 函数模板实参类型不一致问题 参数推导...

  • 14/15

    约束模板友元 模板类的外边定义一个模板函数,在模板类中将模板函数具体化为模板类的友元函数 非约束模板友元 模板类中...

  • ★07.关于类模板

    简述 类模板:是类类型的模板,如:vector。 模板类:类模板的实例化,如:vector 。 类模板的模板参数无...

  • 【C++】C++学习笔记之十六:模板特化

    模板特化分为两种: 模板全特化 模板偏特化 模板全特化 模板偏特化

  • thymeleaf(五) ____文本模板模式

    thymeleaf中的三个文本模板 text模板,javascript模板,css模板是文本模板.而thymel...

  • 14/12

    成员模板:模板类中成员变量是模板类对象(1),模板类中函数是模板函数(2)

网友评论

      本文标题:模板

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