#目录

前文列表

用 Flask 来写个轻博客 (1) — 创建项目

用 Flask 来写个轻博客 (2) — Hello World!

用 Flask 来写个轻博客 (3) — (M)VC_连接 MySQL 和 SQLAlchemy

用 Flask 来写个轻博客 (4) — (M)VC_创建数据模型和表

用 Flask 来写个轻博客 (5) — (M)VC_SQLAlchemy 的 CRUD 详解

用 Flask 来写个轻博客 (6) — (M)VC_models 的关系(one to many)

用 Flask 来写个轻博客 (7) — (M)VC_models 的关系(many to many)

用 Flask 来写个轻博客 (8) — (M)VC_Alembic 管理数据库结构的升级和降级

扩展阅读

Welcome | Jinja2 (The Python Template Engine)

欢迎来到 Jinja2 — Jinja2 2.7 documentation

Jinja

Jinja:是 Python 实现的模板语言。

模板语言:是一种被设计出来自动生成文档的简单文本格式。在模板语言中,一般都会把一些变量传给模板,来替换模板中特定位置上的预先自定义好的占位变量名。向相同的模板文件(HTML+Python)传入不同的变量,达到生成格式相同但内容不同的网页文件,这个生成的过程被称之为渲染

变量名

Jinja 中的变量名都会定义在 {{ variables }} 中,{{}} 被称之为变量代码块

<h1>{{ user.username }}</h1>

变量代码块中可以是任意的 Python 对象或类型,唯一的条件就是 {{}} 中的变量必须能够被 Python 的 str() 内置方法转换成一个 String 类型对象。

注释

注释代码块使用 {# Documents #} 来表示。

控制语句

使用 {% controller_flow %} 来定义控制语句,{%%} 被称之为控制代码块,可以实现一些语言层次的功能。

if 语句

{% if user.is_logged_in() %}
<a href='/logout'>Logout</a>
{% else %}
<a href='/login'>Login</a>
{% endif %}

循环

我们可以正常的循环迭代器或生成器函数。

  • NOTE 1:在 Jinja 中需要同时使用循环语句和 if 语句来模拟 continue 语句的功能。
{% for post in posts if post.text %}
<div>
<h1>{{ post.title }}</h1>
<p>{{ post.text | safe }}</p>
</div>
{% endfor %}
  • NOTE 2:可以使用 Jinja 提供的 loop 变量来模型 Python 中的 enumerate() 内置函数的功能。 loop 变量可以返回一些关于 for 循环的信息,EG. 索引号。
{% for post in posts %}
{{ loop.index }}-{{ post.title }}
{% endfor %}

过滤器

Jinja 过滤器实质上是 Jinja 提供的内置函数或自定义函数,这些内置函数与 Python 函数的类型,可以接收参数并返回结果。常用于处理变量代码块中的变量。在变量代码块中使用管道符 | 来调用。

无参数调用

{{ variable | filter_name }}

带参数调用

{{ variables | filter_name(*args) }}
  • NOTE 1:过滤器也可以在控制代码块 {%%} 中使用。
{% filter filter_name %}
codes
{% endfilter %}

这样的话就可以对控制代码块中的代码进行处理。

:会返回一个 Jinja 模板或 HTML 字符串。其最主要的功能就是提高代码的重用性,我们可以将一个会被反复使用到的模板或 HTML 文件写成一个宏,然后就像调用函数一般,不断的被重用。

定义宏

{% macro input(name, label, value='', type='text')%}
<div class="form-group">
<label for"{{ name }}">{{ label }}</div>
<input type="{{ type }}" name="{{ name }}"
value="{{ value | escape }}" class="form-control">
</div>
{% endmacro %}

这是一个带有 label 标签变量的 Bootstrao VSS 输入框。

  • input():是宏的名字,类似于函数名
  • (name, label, value='', type='text'):是宏的参数,类似于函数的必备参数和缺省参数

调用宏

{{ input('name', 'Name') }}

结果

    <div class="form-group">
<label for"name">Name</div>
<input type="text" name="name"
value="" class="form-control">
</div>

实际上是想宏定义中的形参 name/label/value/type 传入实参 ‘name’/’Name’,其余的使用了缺省参数,而这些被传入的参数会替换 HTML 中的变量代码块。

兼容 JavaScript

如果希望将 JavaScript 代码和 Jinja 代码写在同一个模板文件中而不引起混淆(JavaScript 也含有 {{}} 语法),需要使用 raw 代码块来进行区分。

{% raw %}
JavaScript statements
{% endraw %}

用 Flask 来写个轻博客 (9) — M(V)C_Jinja 语法基础快速概览的更多相关文章

  1. 用 Flask 来写个轻博客 (10) — M(V)C_Jinja 常用过滤器与 Flask 特殊变量及方法

    Blog 项目源码:https://github.com/JmilkFan/JmilkFan-s-Blog 目录 目录 前文列表 Jinja 中常用的过滤器 default float int len ...

  2. 用 Flask 来写个轻博客 (15) — M(V)C_实现博文页面评论表单

    目录 目录 前文列表 实现 post 视图函数 在 posthtml 中添加表单 效果 前文列表 用 Flask 来写个轻博客 (1) - 创建项目 用 Flask 来写个轻博客 (2) - Hell ...

  3. 用 Flask 来写个轻博客 (14) — M(V)C_实现项目首页的模板

    Blog 项目源码:https://github.com/JmilkFan/JmilkFan-s-Blog 目录 目录 前文列表 实现所需要的视图函数 实现 home.html 模板 代码分析 实现效 ...

  4. 用 Flask 来写个轻博客 (13) — M(V)C_WTForms 服务端表单检验

    目录 目录 前文列表 WTForms WTF 的基础使用 常用的字段类型 fieldsDateField fieldsIntegerField fieldsFloatField fieldsStrin ...

  5. 用 Flask 来写个轻博客 (12) — M(V)C_编写和继承 Jinja 模板

    Blog 项目源码:https://github.com/JmilkFan/JmilkFan-s-Blog 目录 目录 前文列表 扩展阅读 使用 Bootstrap 编写 Jinja 模板文件 继承一 ...

  6. 用 Flask 来写个轻博客 (11) — M(V)C_创建视图函数

    目录 目录 前文列表 视图函数 在 viewspy 文件中定义视图函数 定义右侧边栏的视图函数 为每一张数据表定义视图函数 前文列表 用 Flask 来写个轻博客 (1) - 创建项目 用 Flask ...

  7. 用 Flask 来写个轻博客

    用 Flask 来写个轻博客 用 Flask 来写个轻博客 (1) — 创建项目 用 Flask 来写个轻博客 (2) — Hello World! 用 Flask 来写个轻博客 (3) — (M)V ...

  8. 用 Flask 来写个轻博客 (37) — 在 Github 上为第一阶段的版本打 Tag

    Blog 项目源码:https://github.com/JmilkFan/JmilkFan-s-Blog 目录 目录 前文列表 第一阶段结语 打 Tag 前文列表 用 Flask 来写个轻博客 (1 ...

  9. 用 Flask 来写个轻博客 (36) — 使用 Flask-RESTful 来构建 RESTful API 之五

    目录 目录 前文列表 PUT 请求 DELETE 请求 测试 对一条已经存在的 posts 记录进行 update 操作 删除一条记录 前文列表 用 Flask 来写个轻博客 (1) - 创建项目 用 ...

随机推荐

  1. 【SpingBoot】 测试如何使用SpringBoot搭建一个简单后台1

    很久没写博客了,最近接到一个组内的测试开发任务是做一个使用SpringBoot 开发一个后台程序(还未完成),特写感想记录一下 1. 为什么选择SpringBoot ? 首先是目前很多公司的后台还是J ...

  2. JS-iframe高度自适应内容

    iframe:https://developer.mozilla.org/zh-CN/docs/Web/HTML/Element/iframe iframe 内容加载后不改变 使用:onload=&q ...

  3. [BOI 2008]Elect 选举

    题目描述 N个政党要组成一个联合内阁,每个党都有自己的席位数. 现在希望你找出一种方案,你选中的党的席位数要大于总数的一半,并且联合内阁的席位数越多越好. 对于一个联合内阁,如果某个政党退出后,其它党 ...

  4. T1387:搭配购买(buy)

    [题目描述] Joe觉得云朵很美,决定去山上的商店买一些云朵.商店里有n朵云,云朵被编号为1,2,…...,n,并且每朵云都有一个价值.但是商店老板跟他说,一些云朵要搭配来买才好,所以买一朵云则与这朵 ...

  5. HttpClient 之 发送Https请求

    HttpClient包是一个优秀的Http请求的开源jar. 本文Http工具类的封装基于HttpClient,封装后的工具类支持Https请求. 但是由于项目的需要快速的实现,以下代码还可能会有点过 ...

  6. WPF绑定のRelativeSource

    在WPF绑定的时候,指定绑定源时,有一种办法是使用RelativeSource. 这种办法的意思是指当前元素和绑定源的位置关系. 第一种关系: Self 举一个最简单的例子:在一个StackPanel ...

  7. CentOS 7 下配置 Nginx + PHP7.1 + MariaDB 以及 Laravel 框架 2018.3.11

    CentOS 7 下配置 Nginx + PHP7.1 + MariaDB 以及 Laravel 框架 阿里云服务器的选择 当然是选择学生优惠啦.这里阿里云还提供了轻量级服务器这个选项,可以预装 LA ...

  8. Flask-SQLAlchemy使用方法

    Flask-SQLAlchemy使用起来非常有趣,对于基本应用十分容易使用,并且对于大型项目易于扩展.有关完整的指南,请参阅 SQLAlchemy 的 API 文档. 常见情况下对于只有一个 Flas ...

  9. 迄今为止把同步/异步/阻塞/非阻塞/BIO/NIO/AIO讲的这么清楚的好文章(快快珍藏)

    常规的误区 假设有一个展示用户详情的需求,分两步,先调用一个HTTP接口拿到详情数据,然后使用适合的视图展示详情数据. 如果网速很慢,代码发起一个HTTP请求后,就卡住不动了,直到十几秒后才拿到HTT ...

  10. ARM与X86 CPU架构区别

    CISC(复杂指令集计算机)和RISC(精简指令集计算机)是当前CPU的两种架构.它们的区别在于不同的CPU设计理念和方法.早期的CPU全部是CISC架构,它的设计目的是 CISC要用最少的机器语言指 ...