flask自定义过滤器,flash,form表单

mac2024-05-21  35

1.自定义过滤器

自定义的过滤器,过滤器本质上是一个函数,当自带的过滤器不满住要求的时候,我要进行重写

过滤器注册有两种方式

1.app.add_template_filter(自定义过滤器的名字,‘被引用时的名字’) 2.@app.template_filter(‘被引用时的名字’)

def my_reverse(value): print('自定义的过滤器') value_later = value[::-1] return value_later app.add_template_filter(my_reverse,'my_reverse') @app.template_filter('maopaosort') def maopao(value): for j in range(len(value)): for i in range(len(value)-1-j): if value[i]>value[i+1]: value[i],value[i+1]=value[i+1],value[i] return value @app.route('/info') def info(): list1 = [1,2,3,4,5] return render_template('myreverse.html',list1=list1)

可以在HTML页面应用如下 {{ 变量|过滤器 }}

{{ list1|my_reverse }} {{ [7,5,6,9,100,5,1]|maopaosort }}

注意过滤器一定要加到app里面,不然运行py文件的时候不承认它为自定义的过滤器,会报错

2.flash

注意在使用flash的时候必须要设置密匙,因为flash是基于session的 博主一般是将密匙设置在ini文件里然后在py文件中配置文件

#简易版本的密匙,单引号里面随便写 SECRET_KEY = 'hahahahaha'

py文件

#配置文件 app.config.from_pyfile('./config.ini') @app.route('/info') def info(): #消息队列 flash('这是消息队列传递过来的东西') return render_template('flash.html')

HTML页面

{% for msg in get_flashed_messages() %} {{ msg }} {% endfor %}

可以在页面中将flash里面的字符串打印出来

flash的详细介绍
1 设置flash 1.1 flash("要传递的值",category="分类的名称"),如果不传默认是message 本质:session['_flash'] 2取flash设置的值我们用get_flashed_messages 2.1 get_flashed_messages(with_categories=False, category_filter=()), 2.1.1如果不传递 category_filter,取出上面存储的所有分类传递的值 2.1.2如果不传with_categories就只取值,不取分类的名字,如果传值,就获取 分类名和分类值 3 这个flash只能一个视图函数中取,只要有一个视图函数取过了,那其他视图函数就不能获取 本质:session.pop("_flash") 3.1 但是在同一个视图函数里面可以无限的取值

3.form表单

首先我们要在虚拟环境里面下载flash_wtf

pip install flask_wtf

然后就可以使用flask_wtf里面的方法了

from flask_script import Manager from flask import Flask, render_template, flash, request,make_response from flask_wtf import FlaskForm from wtforms import StringField,SubmitField,PasswordField from wtforms.validators import DataRequired app = Flask(__name__) #这个是自带的csrf验证,如果不关闭那么后面则一直验证未通过 app.config['WTF_CSRF_ENABLED'] = False #配置文件 app.config.from_pyfile('./config.ini') manger = Manager(app) #自定义一个表单 class LoginForm(FlaskForm): #validators是验证,如果不写会报空 #用户名,这个是labal username = StringField('用户名',validators=[DataRequired('输入用户名')]) pwd = PasswordField('密码',validators=[DataRequired('输入密码')]) sub = SubmitField('登陆') @app.route('/login',methods=['get','post']) def login(): csrf_token = 'sadasdasdasdsa' loginform = LoginForm() if request.method =='GET': response = make_response(render_template('login.html',form=loginform,csrf_token=csrf_token)) response.set_cookie('csrf_token',csrf_token) return response elif request.method == 'POST': #取出cookie中的csrf_token cookie_csrf = request.cookies.get('csrf_token') print(cookie_csrf) #取出form表单中的csrf_token form_csrf = request.form['csrf_token'] print(form_csrf) print(request.form.get('csrf_token')) #对比 if cookie_csrf != form_csrf: return 'csrf校验未通过' if loginform.validate_on_submit(): print('进入验证') else: print('验证未过') return 'ok' if __name__ == '__main__': manger.run()
1.validators不写

2.HTML页面的代码
<form method="post"> <input type="hidden" name="csrf_token" value={{ csrf_token }}> {{ form.username.label }}{{ form.username }} {{ form.pwd.label }}{{ form.pwd }} {{ form.sub }} </form>

效果:

最新回复(0)