控制语句
在html中所有控制语句都放在{% … %}中,并且有一个语句{% endxxx %}来进行结束,Jinja 中常用的控制语句有 if/for…in…,现对他们进行讲解:
if语句
if语句和python中的类似,可以使用>,<,<=,>=,==,!=来判断,也通过and,or,not,()来进行逻辑并操作
{% if kenny.sick %}
Kenny is sick.
{% elif kenny.dead %}
You killed Kenny! You bastard!!!
{% else %}
Kenny looks okay --- so far
{% endif %}
for循环
for循环可以遍历一个序列包括列表、字典、元组。并且可以进行反向遍历
<ul>
{% for user in users %}
<li>{{ user.username|e }}</li>
{% endfor %}
</ul>
<dl>
{% for key, value in my_dict.iteritems() %}
<dt>{{ key|e }}</dt>
<dd>{{ value|e }}</dd>
{% endfor %}
</dl>
<ul>
{% for user in users %}
<li>{{ user.username|e }}</li>
{% else %}
<li><em>no users found</em></li>
{% endfor %}
</ul>
include语句
include语句可以把一个模板引入到另一个模板中,类似于把一个模板的代码copy到另一个模板的指定位置
{% include 'header.html' %}
主体内容
{% include 'footer.html' %}
#赋值(set)语句
想在模板中添加变量,赋值语句set就派上用场了
{% set name = 'nini' %}
那么以后就可以使用name 来代替nini 这个值了,同时,也可以给他赋值为列表和元组:
{% set navigation = [('index.html','Index'),('about.html','About')] %}
with语句
如果不想让一个变量污染全局环境,可以使用with语句来创建一个内部的作用域,将 set语句放在其中,这样创建的变量只在 with代码块中才有效
{% with %}
{% set foo =42 %}
{{ foo }} foo is 42 here
{% endwith %}
也可在with 的后面直接添加变量,比如
{% with foo = 42 %}
{{ foo }}
{% endwith %}
模板继承
Flask中的模板可以继承,通过继承可以把模板中许多重复出现的元素抽取出来,放在父模板中,并且父模板通过定义block给子模板开一个口,子模板根据需要,再实现这个block,假设现在有一个base.html 这个父模板
<!DOCTYPE html>
<html lang="en">
<head>
<link rel="stylesheet" href="base.css" />
<title>{% block title %}{% endblock %}</title>
{% block head %}{% endblock %}
</head>
<body>
<div id="body">{% block body %}{% endblock %}</div>
<div id="footer">
{% block footer %}
© Copyright 2008 by <a href="http://domain.invalid/">you</a>
{% endblock %}
</div>
</body>
</html>
静态文件的配置
Web应用中会出现大量的静态文件来使网页更加生动美观。类似于css样式文件,javaScript 脚本文件,图片文件,字体文件等静态资源。在jinja 中加载静态文件非常简单,只需要通过url_for全局函数实现
<link herf ="{{url_for('ststic',filename='about.css')}}">
url_for 函数默认会在项目根目录下的static文件夹中寻找about.css 文件,如果找到了,会生成相对于项目根目录的/static/about.css路径。当然我们也可以把静态文件不放在static文件夹中,此时就需要具体指定了
app = Flask(__name__,static_folder='C:\static')
标准类视图
标准类视图是继承自flask.views.View,并且来子类中必须实现dispath_request 方法,这个方法类似于视图函数,也要返回一个基于Response或者子类的对象。以下将用一个例子进行讲解:
from flask.views import View
class PersonalView(View):
def dispatch_request(self):
return "妮妮"
app.add_url_rule('/users/',view_func=PersonalView.as_view('personalview'))
调节方法的视图
Flask还为我们提供了另外一个类视图 flask.views.MethondView,每一个HTTP方法执行不停的函数(映射到对应方法的小写的同名方法上)
class LoginView(views.MethodView):
def get(self):
return render_template("login.html")
def post(self):
email = request.form.get("email")
password = request.form.get("password")
if email == 'xx@qq.com' and password == '111111':
return "登录成功!"
else:
return "用户名或密码错误!"
app.add_url_rule('/myuser/',view_func=LoginView.as_view('loginview'))
|