01-文档

官方文档:http://docs.jinkan.org/docs/jinja2/

02-基本语义

Jinja2做构成的模板文件中,文本内容大致可以分成几个种类。比如特殊文本(不进行转义,比如HTML,XML格式的文本)、{{  }}表示的变量或者宏调用、{%  %}表示逻辑控制,{#  #}表示注释,其中内容不被模板引擎转义。

03-渲染模板

默认情况下,Flask在项目目录中的templates子目录中寻找模板。render_template()

from flask import Flask, render_template

app = Flask(__name__)

app.config.update({
'DEBUG': True,
'TEMPLATES_AUTO_RELOAD': True,
}) @app.route('/')
def index():
return render_template("index.html") @app.route('/user/<name>')
def user(name):
return render_template('user.html', name=name) if __name__ == '__main__':
app.run()

04-变量

Jinja2能识别所有类型的变量,如:列表、字典和对象。

示例:

变量过滤器:

05-控制结构—宏

{% macro render_comment(comment) %}
<li>{{ comment }}</li>
{% endmacro %} <ul>
{% for comment in comments %}
{{ render_comment(comment) }}
{% endfor %}
</ul>

为了重复使用宏,可以把宏保存在单独的文件中,然后再需要使用的模板中导入:

{% import 'macros.html' as macros %}

<ul>
{% for comment in comments %}
{{ render_comment(comment) }}
{% endfor %}
</ul>

需要在多处重复使用的模板代码写入单独的文件,再引入所有的模板中,以避免重复:

{% include 'common.html' %}

06-使用Flask-Bootstrap集成Bootstrap

# 安装

pip install flask-bootstrap

初始化方式:

from flask_bootstrap Bootstrap

bootstrap = Bootstrap(app)

07-自定义错误页面

最常见的错误代码有两个:404,500。使用 app.errorhandler 装饰器为这两个错误提供自定义的处理函数。

@app.errorhandler(404)
def page_not_found(e):
return render_template('404.html'), 404 @app.errorhandler(500)
def page_not_found(e):
return render_template('500.html'), 500

模板的编写-404、500

template/base.html的内容,继承了bootstrap/base.html的新模板。通过继承 template/base.html 模板编写自定义的404错误页面就简单了。

# template/404.html
{% extends ''base.html %} {% block title %}Flasky - Page Not Found{% endblock %} {% block page_content %}
<div class="page-header">
<h1>Not Found</h1>
</div>
{% endblock %}

08-静态文件

默认设置下,Flask在应用根目录中名为static的子目录中,寻找静态文件。

url_for('static', filename='favicon.ico')

09-使用Flask-Moment 本地化日期和时间

# 安装

pip install flask-moment

初始化

from flask_moment import Moment

moment = Moment(app)

templates/base.html 引用 Moment.js库

{% block script %}
{{ super }}
{{ moment.include_moment() }}
{% endblock %}

templates/index.html:使用Flask-Moment渲染时间戳

<p>The local date and time is {{ moment(current_time).format('LLL') }}.</p>

<p>That was {{ moment(current_time).fromNow(refresh=True) }}</p>

fromNow()渲染相对时间戳,会自动刷新时间,最开始显示为 "a few seconds ago",但设定refresh=True其内容会随着时间的推移而更新。

10-Web表单 Flask-WTF

# 安装

pip install flask-wtf

配置Flask-WTF

app = Flask(__name__)

app.config['SECRET_KEY'] = 'hard to guess string'

Falsk-WTF配置一个密钥,是为了防止表单遭到跨站请求伪造(CSRF)攻击。

11-简单验证

from flask import Flask,request,render_template
from wtforms import Form,StringField
from wtforms.validators import Length,EqualTo app = Flask(__name__) class RegistForm(Form):
username = StringField(validators=[Length(min=3,max=10,message='用户名必须在3到10位之间')])
password = StringField(validators=[Length(min=6,max=10,message='密码必须6到10位之间')])
password_repeat = StringField(validators=[Length(min=6,max=10),
EqualTo("password",message='密码不一致')]) @app.route('/')
def hello_world():
return 'Hello World!' @app.route('/regist/',methods=['GET','POST'])
def regist():
if request.method == 'GET':
return render_template('regist.html')
else:
form = RegistForm(request.form)
if form.validate():
return 'success'
else:
print(form.errors)
return 'fail' if __name__ == '__main__':
app.run()

from wtforms import Form,StringField,IntegerField
from wtforms.validators import Length,EqualTo,Email,InputRequired,NumberRange
from wtforms.validators import Regexp,URL,ValidationError class LoginForm(Form):
email = StringField(validators=[Email(message='邮箱格式不正确')])
username = StringField(validators=[InputRequired(message='这个字段必须要填')])
age = IntegerField(validators=[NumberRange(min=18,max=100)])
phone = StringField(validators=[Regexp(r'1[38745]\d{9}')])
homepage = StringField(validators=[URL()])
captcha = StringField(validators=[Length(4,4)]) # 自定义验证器
def validate_captcha(self,field):
if field.data != '': #field.data:用户提交过来的数据
raise ValidationError('验证码错误') #如果验证失败,就抛出验证失败的异常

12-使用wtfforms渲染模板

forms.py

class SettingsForm(Form):
username = StringField(label="用户名:",validators=[InputRequired(message='这个字段必须要填')])
age = IntegerField('年龄:',validators=[NumberRange(min=18, max=100)])
remeber = BooleanField('记住我')
tags = SelectField('标签',choices=[(1,'python'),(2,'django')])

views.py

@app.route('/settings/',methods=['GET','POST'])
def settings():
if request.method == 'GET':
form = SettingsForm()
return render_template('settings.html',form=form)
else:
pass

template.html

<form action="" method="post">
{# 括号里面可以添加样式#}
<p>{{ form.username.label }} {{ form.username(class="") }}</p>
<p>{{ form.age.label }} {{ form.age() }}</p>
<p>{{ form.remeber.label }} {{ form.remeber() }}</p>
<p>{{ form.tags.label }} {{ form.tags() }}</p>
<p><input type="submit" value="提交"></p>
</form>

13-在视图函数中处理表单

在视图函数index()有两个任务:一是渲染表单,二是接收用户在表单中填写的数据。

@app.route('/', methods=['GET', 'POST'])
def index():
name = None
form = NameForm()
if form.validate_on_submit():
name = form.name.data
form.name.data = ''
return render_template('index.html', form=form, name=name)

如果没有指定methods参数,则视图函数只为GET请求处理程序。

14-闪现消息

from flask import Flask, flash, render_template, redirect, url_for, session

@app.route('/', methods=['GET', 'POST'])
def index():
form = NameForm()
if form.validate_on_submit():
old_name = session.get('name')
if old_name is not None and old_name != form.name.data:
flash('Looks like you have changed your name!')
session['name'] = form.name.data
return redirect(url_for('index'))
return redirect('index.html', form=form, name=session.get('name'))

调用flash()函数,在发给客户端的下一个响应中显示一个消息。get_flashed_messages()函数来开放给模板,用于获取并渲染闪现消息。

flask(二)之Jinja2模板与Flask-WTF的更多相关文章

  1. Python框架学习之Flask中的Jinja2模板

    前面也提到过在Flask中最核心的两个组件是Werkzeug和Jinja2模板.其中Werkzeug在前一节已经详细说明了.现在这一节主要是来谈谈Jinja2模板. 一.为什么需要引入模板: 在进行软 ...

  2. Flask 学习(二)jinja2模板介绍

    控制语句和表达式 举例 Flask Python代码 from flask import Flask, render_template, redirect, request app = Flask(_ ...

  3. Flask初学者:Jinja2模板

    Python的Jinja2模板,其实就是在HTML文档中使用控制语句和表达语句替换HTML文档中的变量来控制HTML的显示格式,Python的Jinja2模板可以更加灵活和方便的控制HTML的显示,而 ...

  4. Flask 框架下 Jinja2 模板引擎高层 API 类——Environment

    Environment 类版本: 本文所描述的 Environment 类对应于 Jinja2-2.7 版本.   Environment 类功能: Environment 是 Jinja2 中的一个 ...

  5. 测开之路二十九:Flask基础之jinja2模板

    中文文档:http://docs.jinkan.org/docs/jinja2/ 与静态资源一样,Flask默认的模板目录名为templates,如果有需要的话和static一样,要在初始化的时候声明 ...

  6. 测开之路三十:Flask基础之jinja2模板继承

    实现某些位置的内容固定,某些位置的内容动态展示,如: 中文文档地址:http://docs.jinkan.org/docs/jinja2/templates.html#template-inherit ...

  7. 十二:jinja2模板中使用url_for

    在页面中,有点击跳转到另一个地址的时候,可以使用url_for来指定要跳转的视图函数:{{ url_for('view_function') }} 如果该视图需要接收参数

  8. 02 flask 请求钩子、异常捕获、上下文、Flask-Script 扩展、jinja2 模板引擎、csrf防范

    一 请求勾子 在客户端和服务器交互的过程中,有些准备工作或扫尾工作需要处理,比如: 在请求开始时,建立数据库连接: 在请求开始时,根据需求进行权限校验: 在请求结束时,指定数据的交互格式: 为了让每个 ...

  9. Flask (二) cookie 与 session 模型

    会话技术 Cookie 客户端端的会话技术 cookie本身由浏览器保存,通过Response将cookie写到浏览器上,下一次访问,浏览器会根据不同的规则携带cookie过来 ​ 特点:   - 客 ...

随机推荐

  1. 初识 MongoDB,MongoDB 的安装运行

    1.  MongoDB 非关系型数据库  MongoDB是一个基于分布式文件存储的数据库,由C++语言编写.目的是为WEB应用提供扩展的高性能的数据存储解决方案.MongoDB是一个介于关系型数据库和 ...

  2. C#添加PDF页眉——添加文本、图片到页眉

    页眉常用于显示文档的附加信息,我们可以在页眉中插入文本或者图形,例如,页码.日期.公司徽标.文档标题.文件名或作者名等等.那么我们如何以编程的方式添加页眉呢?今天,这篇文章向大家分享如何使用了免费组件 ...

  3. js正则表达式 数字和小数点 非负数 保留两位小数点

    验证数字非负数  小数点保留两位小数点 下面正则已验证通过 /^(?!0+(?:\.0+)?$)(?:[1-9]\d*|0)(?:\.\d{1,2})?$/

  4. JavaScript的工作原理:解析、抽象语法树(AST)+ 提升编译速度5个技巧

    这是专门探索 JavaScript 及其所构建的组件的系列文章的第 14 篇. 如果你错过了前面的章节,可以在这里找到它们: JavaScript 是如何工作的:引擎,运行时和调用堆栈的概述! Jav ...

  5. 1.SDL介绍

    01.什么是SDL SDL是微软提出的一种软件开发安全生命周期管理的一种最佳安全实践,全称为Security Development Lifecycle. SDL是微软软件开发安全保障流程,结合了软件 ...

  6. 如何解决升级到Dynamics 365后有很多的Sandbox的WorkerProcess并导致异常?

    关注本人微信和易信公众号: 微软动态CRM专家罗勇 ,回复254或者20170505可方便获取本文,同时可以在第一间得到我发布的最新的博文信息,follow me!我的网站是 www.luoyong. ...

  7. QT 启动shell脚本

    1.QProcess *p = new QProcess(this); 2.QString str = qApp->applicationDirPath() + "/update.sh ...

  8. 南京邮电大学 JavaA期末复习要点总结

    南京邮电大学 JavaA复习要点: Chap1 入门 1.  Java应用程序开发过程教材P14~P15 Chap 2 基本语法 1.      标识符的命名规则教材P19 字母下划线美元符号开头,除 ...

  9. 18-10-31 Scrum Meeting 3

    1.会议照片 2.每人的工作 昨天完成的工作   1 制定配置 修改配置 查询配置这三个接口   2 3 获取单词对应的中文释义   4 完成测验的部分接口   5 后端对接计划的接口   6 剩余的 ...

  10. [20190415]关于shared latch(共享栓锁).txt

    [20190415]关于shared latch(共享栓锁).txt http://andreynikolaev.wordpress.com/2010/11/17/shared-latch-behav ...