jinja2 模版引擎

官方网站
http://docs.jinkan.org/docs/jinja2/
类似于java中thymeleaf,jinja2 是一个现代的,设计者友好的,仿照 Django 模板的 Python 模板语言。 它速度快,被广泛使用,并且提供了可选的沙箱模板执行环境保证安全:
<title>{% block title %}{% endblock %}</title><ul>{% for user in users %}<li><a href="{{ user.url }}">{{ user.username }}</a></li>{% endfor %}</ul>
特性:
- 沙箱中执行
- 强大的 HTML 自动转义系统保护系统免受 XSS
- 模板继承
- 及时编译最优的 python 代码
- 可选提前编译模板的时间
- 易于调试。异常的行数直接指向模板中的对应行。
- 可配置的语法
模版继承
base.html ``` <!DOCTYPE html> {% block head %} {% endblock%} {% block body%}This is base body!
{% endblock %}
base2.html
{% extends “base.html” %} {% block title%}Index{% endblock %} {% block head %} {{ super() }} {% endblock head%}
{% block body %} {{super()}}
Hello World
{% endblock body%}
### 继承base页面写出404
{% extends “user.html” %} {% block title %}
not found
{% endblock title%} {% block page_content %} {{super()}} {% endblock %} {% block content %} Page Not Found{% endblock %}
## flask-bootstrap
from flask import Flask,render_template from Config import Config from flask_bootstrap import Bootstrap
app = Flask(name) app.config.from_object(Config) bootstrap = Bootstrap(app) # 将应用实例传给构造函数
@app.route(“/“) def index(): return render_template(“user.html”)
app.run()
```{% extends "bootstrap/base.html" %}{% block title %}{% endblock title %}{% block navbar %}<div class="navbar navbar-inverse" role="navigation"><div class="container"><div class="navbar-header"><button type="button" class="navbar-toggle"data-toggle="collapse" data-target=".navbar-collapse"><span class="sr-only">Toggle navigation</span><span class="icon-bar"></span></button><a class="navbar-brand" href="/">Flask</a><div class="navbar-collapse collapse"><ul class="nav navbar-nav"><li><a href="/">Home</a></li></ul></div></div></div></div>{% endblock navbar%}{% block content %}<div class="container"><div class="page-header"><h1>Hello bootstrap</h1></div></div>{% endblock content %}
Flask-Moment
UTC协调世界时,然后经过js渲染,调用每个用户本地的时区信息就能够转换为用户当地时间。
Flask-Moment是一个Flask扩展,能简化把Moment.js集成到jinja2模版中。
下面是一个简单的应用例子:
前端页面模板部分代码:
{% block scripts %}{{ super() }}{{ moment.include_moment() }} //在前端中通过方法引用moment.js文件{{ moment.locale('zh-cn') }} //将moment.js本地化,否则渲染出来的时间日期都是英文的{% endblock %}{% block page_content %}{{ super() }}<h3>Time now is {{ moment(current_time).format('LLL') }}</h3><hr>{% endblock %}
后端部分代码:
m = Moment(app) #和bootstrap一样,不要忘了这一步,否则前端报找不到moment类的错@app.route('/time',methods=['GET'])def show_time():return render_template('time.html',current_time=datetime.datetime.utcnow())
表单校验
{% extends "base.html" %}{% import "bootstrap/wtf.html" as wtf %}{% block title %}User{% endblock %}{% block page_content %}<div class="page-header"><h1>Hello, User page!</h1><hr><!-- <form action="" method="POST">{{form.hidden_tag() }}{{form.name.label}} {{form.name}}{{form.email.label}} {{form.email}}{{ form.submit() }}</form> -->{{wtf.quick_form(form)}}{% if name %}<h2>Welcom {{name}} </h2>{% endif %}<hr><p>The local date and time is {{ moment(current_time).format('LLL') }}.</p><p>That was {{ moment(current_time).fromNow(refresh=True) }}.</p></div>{% endblock %}
from flask import Flask,render_templatefrom Config import Configfrom flask_bootstrap import Bootstrapfrom flask_moment import Momentfrom datetime import datetimefrom flask_wtf import FlaskFormfrom wtforms import StringField,SubmitFieldfrom wtforms.validators import DataRequired,Emailapp = Flask(__name__)app.config.from_object(Config)bootstrap = Bootstrap(app) # 将应用实例传给构造函数m = Moment(app)# 定义表单类class NameForm(FlaskForm):name = StringField('What is your name?',validators=[DataRequired()])email = StringField("Enter your email",validators=[Email()])submit = SubmitField('Submit')@app.route("/")def index():utc = datetime.utcnow()return render_template("index.html",current_time=utc)@app.route("/user",methods=['get','post'])def user():name = Noneemail = Noneform = NameForm()if form.validate_on_submit(): # 如果通过验证name = form.name.dataemail = form.email.dataform.name.data = '' # 重制form.email.data = ''utc = datetime.utcnow()return render_template("user.html",current_time=utc,form=form,name=name,email=email)@app.errorhandler(404)def errorhandler(e):return render_template('404.html'),404@app.errorhandler(500)def internal_server_error(e):return render_template('500.html'),500app.run()
flask-BootStrap
在exts中的init中引入
from flask_sqlalchemy import SQLAlchemyfrom flask_bootstrap import Bootstrapbootstrap = Bootstrap()db = SQLAlchemy()
apps中的init绑定bootstarp
from flask import Flask,render_template,session,redirect,url_for,flashfrom settings import Configfrom flask_bootstrap import Bootstrapfrom flask_moment import Momentfrom datetime import datetimefrom flask_wtf import FlaskFormfrom wtforms import StringField,SubmitFieldfrom wtforms.validators import DataRequired,Emailfrom exts import db, bootstrapfrom apps.user.model import *def create_app():app = Flask(__name__, template_folder='../templates/', static_folder='../static/') # type:Flaskapp.config.from_object(Config)bootstrap.init_app(app=app) # bootstrapm = Moment(app)db.init_app(app) # 数据库app.register_blueprint(user_bp)# print(app.url_map)return app
基本语法可以参考下面这篇博文:
http://www.bjhee.com/jinja2-statement.html
自定义过滤器
@index_bp.app_template_filter('summary')def summary(content):return content[:50]+'......'
<p class="my-font-description" >{{ arti.content|summary }}</p>
