- 变量代码块
{{ }}来表示变量名,这种{{ }} 语法叫做变量代码块
{{ post.title}}
@app.route('/')
def index():
# 需要传入网址
url_str = 'www.ithema.com'
my_list =[1,2,3,4,5]
my_dict={
'name':'李华',
'url':'www.itheima.com'
}
# 通常,模板中使用的变量名和要传递的数据的变量名保持一致
return render_template('index.html', url_str=url_str, my_list=my_list, my_dict=my_dict)
<body>
这是模板<br>
这是首页<br>
{#下面是一个变量代码块的使用#}
{{url_str}}<br>
{{my_list}}<br>
{#字典使用 #}
{{my_dict}}<br>
{{my_dict.url}}<br>
{{my_dict[url]}}<br>
</body>
jinja2模板中的变量代码块可以使任意Python类型或者对象,只要它能够被Python中的str()方法转换为一个字符串就行,可以使用下面方式显示一个字典或者列表中的某个元素。
{{my_dict.url}}
{{my_dict['url']}}
{{list[0]}}
- 控制代码块
用{% %}来定义控制代码块,可以实现一些语言层次的功能,比如循环,或者if语句
<hr>
{# 控制代码块 #}
{# For循环的使用 #}
{% for my in my_list %}
{{my}}<br>
{% endfor %}
{% for my in my_list %}
{% if my >3 %}
{{my}}<br>
{% endif %}
{% endfor %}
- 过滤器
本质是函数,有时候我们不仅仅需要输出变量的值,还需要修改变量的显示,甚至格式化,运算等等,而在模板中时不能直接调用Python中的某些方法,那么就用到了过滤器
使用方式:
过滤器的使用方式为: 变量名|过滤器
{{variable|filter_name(*args)}}
如果没有任何参数传给过滤器,则可以把括号省略掉
{{variable|filter_name}}
- 链式调用
在jinja2中,过滤器是可以支持链式调用的,示例如下
{{ "hello" | upper | reverse }}
<hr>
{# 链式调用 #}
{{ url_str | upper | reverse }}<br>
- Web表单
使用普通方式实现表单
<form method="post">
<label>用户名:</label><input type="text" name="username"><br>
<label>密码:</label><input type="password" name="password"><br>
<label>确认密码:</label><input type="password" name="password2"><br>
<input type="submit" value="提交"><br>
</form>
@app.route('/', methods=['GET', 'POST'])
def index():
# request:请求对象-->获取请求方式、数据
if request.method == 'POST':
# 2.获取请求的参数
username = request.form.get('username')
password = request.form.get('password')
password2 = request.form.get('password2')
# 3. 判断参数是否填写, 密码是否相同
if not all([username, password, password2]):
print('参数不完整')
elif password != password2:
print("密码不一致")
else:
return 'success'
return render_template('wtf.html')
flash 消息闪现
<form method="post">
<label>用户名:</label><input type="text" name="username"><br>
<label>密码:</label><input type="password" name="password"><br>
<label>确认密码:</label><input type="password" name="password2"><br>
<input type="submit" value="提交"><br>
{# 使用遍历获取闪现的消息 #}
{% for message in get_flashed_messages() %}
{{message}}
{% endfor %}
</form>
视图函数
@app.route('/', methods=['GET', 'POST'])
def index():
# request:请求对象-->获取请求方式、数据
if request.method == 'POST':
# 2.获取请求的参数
username = request.form.get('username')
password = request.form.get('password')
password2 = request.form.get('password2')
# 3. 判断参数是否填写, 密码是否相同
if not all([username, password, password2]):
# print('参数不完整')
flash('参数不完整')
elif password != password2:
# print("密码不一致")
flash('密码不一致')
else:
return 'success'
return render_template('wtf.html')
使用Flask-WTF实现表单
模板页面:
<form method="post">
{{ form.csrf_token() }}
{{ form.username.label }}{{ form.username }} <br>
{{ form.password.label }}{{ form.password }} <br>
{{ form.password2.label }}{{ form.password2 }} <br>
{{ form.submit}} <br>
</form>
class LoginForm(FlaskForm):
username = StringField('用户名:', validators=[DataRequired()])
password = PasswordField('密码:', validators=[DataRequired()])
password2 = PasswordField('确认密码:', validators=[DataRequired(), EqualTo('password', '密码填入的不一致')])
submit = SubmitField('提交')
@app.route('/form', methods=['GET', 'POST'])
def login():
login_form = LoginForm()
# 1. 判断请求方式
if request.method == 'POST':
# 2. 获取请求的参数
username = request.form.get('username')
password = request.form.get('password')
password2 = request.form.get('password2')
# 3. 验证参数. WTF可以一句话就实现所有的校验
# 我们没有CSRF token
if login_form.validate_on_submit():
print(username, password)
return 'success'
else:
flash('参数有误')
return render_template('login.html', form=login_form)