Flask框架(二)

Flask框架

  • 模板加载
    在视图函数中通过 render_template(“模板地址”,“关键字参数”),加载模板,参数通过关键字传递
from flask import Flask,render_template

app = Flask(__name__)

@app.route("/register/")
def register_view():
	return render_template("register.html")

在这里插入图片描述

  • 模板标签:在python的web框架中,前端要渲染后端数据所要用到的特殊HTML标签
  1. if标签
    {% if 判断条件1 %}

    {% elif 判断条件2 %}

    {% else %}

    {% endif %}

  2. for标签
    {% for 循环变量 in 将要遍历的变量 %}
    循环体
    {% endfor %}

# 示例
from flask import Flask.render_template

app = Flask(__name__)

@app.route("/fruits/")
def fruits_view():
	fruits = {"橘子","西瓜","香蕉","苹果","菠萝"}
	return render_template("fruits.html",fruits=fruits)

后端传给前端的变量就是模板变量,在模板中借助模板标签进行数据渲染。
{% %}: 一般是判断、遍历、导入、加载使用
{{ }}:一般是展示数据使用

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Fruits</title>
</head>
<body>
    {% if fruits %}
        <ul>
            {% for fruit in fruits %}
                <li>{{ fruit }}</li>
            {% endfor %}

        </ul>
    {% endif %}
</body>
</html>

在这里插入图片描述

  • 模板继承:当多个模板中的部分标签相同时,我们可以把这部分标签抽出来,放在一个模板中,其余的模板继承自该模板,这个模板就是基类模板或者父模板。
    在父模板中使用
    • {% block 块标签名称 %}
    • {% endblock %} “挖坑”;
      在子模板中通过{% extends ‘父模板的位置’ %}继承父模板,并通过块模板标签“填坑”。
      如果在子模板中需要继承父模板块标签中的内容,则使用{{ super() }}

父模板:在需要更改的地方使用block标签"挖坑",在子模板继承后,需要修改的地方"填坑"

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>{% block title %}{% endblock %}</title>
    <link rel="stylesheet" href="">
    {% block link %}{% endblock %}
</head>
<body>
{% block headers %}
    <div class="headers" style="color: blue">这是父模板中的headers</div>
{% endblock %}

{% block mian %}
<div class="main">
    {% block contain %}
        <div class="main-contain"></div>
    {% endblock %}
    {% block side %}
        <div class="main-side"></div>
    {% endblock %}
</div>
{% endblock %}
<div class="footer"></div>
<script type="text/javascript" src="https://cdn.bootcss.com/jquery/3.4.1/jquery.js"></script>
{% block script %}{% endblock %}
</body>
</html>

子模板:需要修改的可以在子模板中使用block标签选中更改,不需要修改的不写,既需要继承又需要修改的使用 {{ super() }}

{% extends 'base.html' %}

{% block title %}
    主页
{% endblock %}

{% block link %}
    <link rel="stylesheet" href="">
{% endblock %}

{% block headers %}
    {{ super() }}
    <div>
        <p style="color:crimson">这是子模板中的p标签</p>
    </div>
{% endblock %}

{% block side %}
    <div class="main-side">
        <div>
            ...
        </div>
    </div>
{% endblock %}

@app.route("/p/")
def base_view():
    return render_template("index.html")

在这里插入图片描述

  • 模板包含:有时候,有一部分模板在很多模板中都会使用到,这时候,我们可以把这部分标签抽出来,单独写一个模板页面,模板中只写入这部分html代码,在需要的模板中直接拿过来用即可,在子模板中需要的地方使用{% include “需要的标签模板路径” %}接入。

需要使用到的部分html标签

友情链接:
<a href="https://www.baidu.com">百度</a>
<a href="https://www.sohu.com">搜狐</a>
<a href="https://www.360.com">360</a><br/>
联系电话:151xxxxx

要使用部分标签的模板

{% extends 'base.html' %}

{% block title %}
    主页
{% endblock %}

{% block link %}
    <link rel="stylesheet" href="">
{% endblock %}

{% block headers %}
    {{ super() }}
    <div>
        <p style="color: crimson">这是子模板中的p标签</p>
    </div>
{% endblock %}

{% block side %}
    <div class="main-side">
        <div>
            ...
        </div>
    </div>
{% endblock %}
{% block footer %}
	{% include 'foot_link.html' %}
{% endblock %}

在这里插入图片描述

  • 宏(macro):将模板中的常用处理逻辑封装起来,方便模板重复调用,很少用到,这里就不在赘述了。

  • 模板过滤器:模板过滤器就是对模板变量,在模板展示渲染的数据进行过滤处理。
    在模板变量显示之前通过模板过滤器对显示内容做最后处理
    常用过滤器:

    • upper: 全部大写
    • lower: 全部小写
    • title: 对每个单词的首字母大写
    • capitalize: 对首字母大写
    • reverse: 字符串倒序
    • sum : 数字列表求和
    • safe: 不对特殊字符转义
    • replace:替换
    • sort:排序
    • length:长度
@app.route("/tag/")
def tag_view():
    data = {
        "A":"hello",
        "B":"WORLD",
        "C":[1,2,3,4,5],
        "D":"Today is nice day.",
        "date":"2019,10,24",
        "html":"<em>hello</em>"
    }
    return render_template("index.html",{"data":data})

模板中使用过滤器

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Fruits</title>
</head>
<body>
<ul>
    <li>{{ data.A|lower }}</li>
    <li>{{ data.B|upper }}</li>
    <li>{{ data.C|sum }}</li>
    <li>{{ data.D|title }}</li>
    <li>{{ data.D|capitalize }}</li>
    <li>{{ data.D|reverse }}</li>
    <li>{{ data.date|replace(",","-") }}</li>
    <li>{{ data.html|safe }}</li>
    <li>{{ "haskhflhaljla"|length }}</li>
    <!-- 正序 -->
    <li>{{ [12,54,31,45,2,4,3,99]|sort }}</li>
   	<!-- 倒序 -->
    <li>{{ [12,54,31,45,2,4,3,99]|sort(reverse=True) }}</li>
</ul>
</body>
</html>

在这里插入图片描述

  • 自定义模板过滤器:
# 方法一
def customer_filter(value):
    data = {
        0:"女",
        1:"男"
    }
    return data[value]
# 注册自动义过滤器
app.add_template_filter(customer_filter,"check_sex")

#方法二
@app.template_filter("chenk_sex")  # 装饰器加入自定义过滤器
def customer_filter(value):
    data = {
        0:"女",
        1:"男"
    }
    return data[value]

# 方法三
custom = app.jinja_env
custom.filters["check_sex"] = customer_filter  # 注册自定义过滤器

# 视图函数
@app.route("/filter/")
def filter_view():
    data = {
        "name":"Tom",
        "sex":1,
        "score":90
    }
    return render_template("filter.html",data=data)

在模板中展示

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>customer filter</title>
     <style>
        table tr td{
            width: 100px;
        }
    </style>
</head>
<body>
<table border="1px" cellspacing="0">
    <tr>
        <td>{{ data.name }}</td>
        <!-- 使用自定义的过滤器 -->
        <td>{{ data.sex|check_sex }}</td>
        <td>{{ data.score }}</td>
    </tr>
</table>
</body>
</html>

在这里插入图片描述

  • 静态资源的加载: {{ url_for(‘static’,filename=“文件的路径”) }}
    在文件夹中保存好要加载的静态文件
    在这里插入图片描述
    在这里插入图片描述
@app.route("/static/")
def static_view():
    return render_template("static.html")
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>static load</title>
</head>
<body>
    <img src="{{ url_for('static',filename='img/a.jpg') }}" alt="">
    <script src="https://cdn.bootcss.com/jquery/3.4.1/jquery.js"></script>
    <script src="{{ url_for('static',filename='js/static.js') }}"></script>
</body>
</html>

在这里插入图片描述

  • 给前端返回json数据:使用jsonify()
    将字典包装(将字典、列表、元祖传入jsonify()中),返回给客户端,客户端以json格式接收
@app.route("/json/")
def json_view():
    data = {
        "name":"Tom",
        "age":20,
        "sex":"男",
        "work":"coder"
    }
    return jsonify(data)

在这里插入图片描述

待更新!!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Calm_1024

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值