jinjia2 模板库- django/flask

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 模板加载静态文件

  1. django.contrib.staticfiles 已经添加到 settings.INSTALLED_APPS中(默认)
  2. 确保在settings.py中设置了STATIC_URL
  3. app下创建static文件夹,在static文件夹下创建当前app名字文件夹,将静态文件放入其中
  4. 如果静态文件不与任何app挂钩,那么在settings.py中添加 STATICFILES_DIRS,以后DTL就会在这个列表的路径中查找静态文件。
  5. 在模板中使用load标签加载 static 标签
# 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')}}		# 宏使用

你可能感兴趣的:(django,flask)