jinjia2库
django模板渲染
# setting 中配置静态模板文件路径
# TEMPLATES [{DIR[os.path.join(BASE_DIR,'templates')]}] 设置模板路径
# 查找顺序,先主 templates, 然后再 注册app中的 templates
from django.template.loader import render_to_string,render
from django.http import HttpResponse
# render_to_string()
def index(request):
html = render_to_string("index.html")
return HttpResponse(html)
# render()
def index(request):
return render(request,"index.html")
flask 模板渲染
from flask import Flask,render_template
app = Flask(__name__,template_folder =r'C:\templates') # template_folder 指明模板路径
# render_template() 渲染模板、 **{} 可传递参数
@app.route('/about/')
def about():
return render_template("about.html",**{'user':'lcl'})
控制语句(django + flask)
# 控制结构 {% %}
# 变量取值 {{ }}
# 注释 {# #}
# if 语句
{% if user ="lcl" %}
<p>{{user}}<p>
{% endif %}
# for 循环
{% for user in users %}
<li>{{ user.username|title }}</li>
{% endfor %}
# for in empty 标签(遍历如果没有元素情况下,执行empty内容)
{% for person in persions %}
<li>{{person}}</li>
{% empty %}
<p>"暂时没有任何人"</p>
{% endfor%}
{{loop.index}} #当前迭代的索引(从 1 开始)
{{loop.index0}} # 当前迭代的索引(从 0 开始)
{{loop.first}} # 是否是第一次迭代,返回 true 或 false
{{loop.last}} # 是否是最后1次迭代,返回 true 或 false
{{loop.length}} # 序列的长度
模板中传递参数
django模板变量
from django.shortcuts import render
from django.template.loader import render_to_string
from django.http import HttpResponse
def index(request):
content ={"name":"lcl"}
html = render_to_string("index.html",context=content)
return HttpResponse(html)
# 模板文件
<html>
<p>{{name}}</p>
</html>
flask模板变量
flask.render_template(template_name_or_list, **context) # 返回HTML模板
flask.render_template_string(source, **context) # 模板内容
flask.get_template_attribute(template_name, attribute)
# 模板中
<html>
<p>{{ name }}:{{age}}</p> #对应 方式1
<p>{{ context.name }}:{{context.age}}</p> #对应 方式2
</html>
# views中
@app.route('/index')
def index():
context = {'name':'lcl', 'age':18 }
# render_template 返回模板文件
return render_template("index.html",**context) # 方式1
return render_template("index.html",context= context) # 方式2
url标签(django + flask)
# url 标签 href
<li><a href="www.baidu.com">百度首页</li>
# 对应路由
<li><a href="/move">电影首页</li>
# 路由变量对应(路由中一点要取名字)
<li><a href="{% url 'moive' %}">电影首页</li>
# url 标签中传参 2 为参数
<li><a href="{% url 'moive' 2 %}">电影首页</li>
<li><a href="{% url 'moive' mid=2 %}">电影首页</li>
<li><a href="{% url 'moive' mid=2 uid=1 %}">电影首页</li> # 多个参数
<li><a href="{% url 'moive'%}?mid=2 ">电影首页</li>
<li><a href="{% url 'front:moive' 2 %}">电影首页</li> # 加入引用命名空间
# 模板中的字符转义(Marup 转化变量中的特殊字符)
from flask import Markup
print(Markup("带有特殊字符的语句")) # 直接打印带有特殊字符的语句,如果不进行转义 则特殊字符对应HTML中的标签
# 定义404等错误响应(flask.abort函数)
from flask import Flask, render_template_string, abort
app = Flask(__name__)
@app.route('/user')
def user():
abort(401) # Unauthorized 未授权
print('Unauthorized, 请先登录')
if __name__ == '__main__':
app.run(port=5000, debug=True)
# 自定义错误界面
from flask import Flask, render_template_string, abort
app = Flask(__name__)
@app.route('/user')
def user():
abort(401) # Unauthorized
@app.errorhandler(401)
def page_unauthorized(error):
return render_template_string(' Unauthorized
{{ error_info }}
', error_info=error), 401
if __name__ == '__main__':
app.run(port=5000, debug=True)
模板过滤器
过滤符 | 含义 |
---|---|
{{value/add:“2”}} | 返回value值+2的值 |
{{value/cut:" "}} | 移除所有指定的字符串 |
{{birthday/data:“Y/m/d”}} | 将日期按照指定格式,格式成字符串 |
abs(value) | 返回绝对值 |
default(value,feault_value,boolean= false) | 如果前面变量没有值,则使用参数中的值代替 |
escape(value) | 转义字符,会将<> 等字符转义成HTML中的字符 |
first(value) | 返回一个序列的第一个元素 |
format(value,*arags,**kwargs) | 格式化字符串 |
last(value) | 返回序列的最后一个元素 |
length(value) | 返回序列或字典的长度 |
join(value,d=u’’) | 将一个序列用d这个值拼接成字符串 |
safe(value) | 如果开启全局转义,那么safe过滤器将边量关掉转义 |
int(value) | 将值转换为int类型 |
float(value) | 将值转换为float类型 |
lower(value) | 将字符串转换成小写 |
upper(value) | 将字符串转换成大写 |
replace(value,old,new) | 替换将old替换为new的字符串 |
truncate(value,length=255,killwords=False) | 截取length长度的字符串 |
striptags(value) | 删除字符串中所有的HTML标签,如果出现多个空格,将替换成一个空格 |
trim | 截取字符串前面和后面的空白字符 |
string(value) | 将变量转换成字符串 |
wordcount(s) | 将字符串转换成小写 |
int(value) | 计算一个长字符串中单词的个数 |
flask/django常用标签
@app.route('/index')
def index():
context = {'name':'lcl',
'age':18,
'es':<script>slert("hello");</script>,
'books':['python','java']
}
# render_template 返回模板文件
return render_template("index.html",**context) # 方式1
<p>{{ age|abs }}</p> # 对 age 值取绝对值
<p>{{ student|default("默认值") }}</p> # 若 student 没有值,则显示 默认值
<p>{{es}}</p> # 自动开启转义
<p>{{es |escape }}</p> # 开启自动转义字符
<p>{{es| safe}}</p> # 标记为安全,关闭转义
{% autoescape off %}
<p>{{es}}</p> # 关闭转义
{% endautoescape %}
<p>{{ books|first }}</p> # 取第一个值
<p>{{ books|last }}</p> # 取最后一个值
<p>{{ books|length }}</p> # 请求 books的长度
<p>{{ books|first|length }}</p> # 第一个值的长度
<p>{{ books|last|last }}</p>
<p>{{ username|upper }}</p> #将值全部大写
<p>{{ username|replace("hello","Hello") }}</p> # 将老的值进行替换
<p>{{ username|truncate(length=5)}}</p>
<p>{{ username|truncate(length=5)}}</p>
模板结构优化 — 引入模板
# 模板引入 - 模板寻找方式与 templates 一致
{% include 'header.html' %}
{% include 'footer.html' %}
模板继承
# 模板继承
{% extends "base.html" %}
{% block content %}
<p>需要自己设置的内容</p>
{% endblock %}
django 模板加载静态文件
# 2、setting.py中设置 STATIC_URL
STATIC_URL = "/static/"
# 4、设置 STATICFILES_DIRS
STATICFILES_DIRS = [
os.path.join(BASE.DIR,"static")
]
# 设置全局 {% load static %}
# settings/TEMPLATES/OPTIONS
"builtins":['django.templatetaags.static']
# 5、加载static/style.css 文件
{% load static %}
<link rel="stylesheet" href="{% static "style.css"%}">
<div><img src="{% static "Django.jpg"%}" alt=""></div>
模板中的宏
# 宏(函数、执行动作)但不能有返回值 macro 定义
# 定义宏
{% macro input(name,age=18) %} # 参数age的默认值为18
<input type='text' name="{{ name }}" value="{{ age }}" >
{% endmacro %}
# 使用宏(input为宏名)
<table>
<tr>
<td>用户名:</td>
<td>{{input('username')}}</td>
</tr>
<tr>
<td>密码:</td>
<td>{{input('password',type='psward')}}</td>
</tr>
<tr>
<td>提交:</td>
<td>{{input(value = '提交',type='submit')}}</td>
</tr>
</table>
# 宏文件的导入 - 将 marco.html 中的宏导入到当前文件中
{% import 'marco.html' as macro with context %} # 导入宏,with context 为传参用
{{macro.input('username')}} # 宏使用
{% from "marco.html" import input %} # 导入
{{input('password',type='psward')}} # 宏使用