一. Flask中的特殊装饰器
before_request
# before_request 是在视图函数执行之前执行的
@app.before_request
def before():
print('我是before_request')
# return '有我在,你永远到不了视图函数'
# 如果return的不是None,那么会直接返回,到不了视图函数
after_request
# after_request 是在视图函数执行之后执行的
@app.after_request
def after(ret): # 由于他在视图函数执行之后执行,所以它要接收视图函数的返回值
print('我是after_request')
return ret # ret就是视图函数的返回值
errorhandler
@app.errorhandler(404) # 括号里面写报错信息,例:访问的网址不存在就是404错误
def error404(error_msg):
print(f'{error_msg}') # 404 Not Found
return f'你丫瞎输什么网址,看好喽! ' # 自定义的回复消息
特殊装饰器执行的顺序
二 . CBV
from flask import Flask, views
app = Flask(__name__)
class Login(views.MethodView): def get(self):
return "login" def post(self):
return "post_login"
# CBV要用这中方式添加路由 view_func中的name参数必须写,而且只能是name='随便写'
app.add_url_rule("/login",view_func=Login.as_view(name="login"))
#这个name='login' 就是endpoint='login'
if __name__ == '__main__':
app.run(debug=True)
三 . 第三方组件
Flask-Session
# pip install Flask-Session
# 由于Flask太精简了,导致连存session的地方都没有,所以需要存到redis中去,flask中要下载redis
# pip install redis windows中也要安装redis,并且启动,这样flask中的redis才能用 from flask import Flask, session
from flask_session import Session
from redis import Redis app = Flask(__name__)
# 指定redis存储session
app.config['SESSION_TYPE'] = 'redis'
# 指定redis连接
app.config['SESSION_REDIS'] = Redis('127.0.0.1', 6379, db=6)
# db=6, 表示使用数据库6,redis一共有0-15这16个数据库,什么也不写默认数据库0
# 替换Flask原有的session机制
Session(app) @app.route('/index')
def test():
# 存在session到redis中
session['key'] = True
# 取出session中数据
# print(session.get('key'))
return '我是测试' if __name__ == '__main__':
app.run(debug=True)
WTForms(相当于Django中的modelform)
from flask import Flask, request, render_template app = Flask(__name__)
# simple是简单使用, core是核心功能
from wtforms.fields import simple, core
from wtforms import Form
from wtforms import validators class RegisterForm(Form):
username = simple.StringField(
label='用户名',
validators=[
validators.DataRequired(message='不能为空'),
validators.Length(max=16, min=6, message='要在%(min)d和%(max)d之间')
],
# 使用bootstrap的时候,添加样式
render_kw={'class': 'form-control'},
id='username'
)
password = simple.PasswordField(
label='密码',
validators=[
validators.DataRequired(message='不能为空'),
validators.Length(max=16, min=6, message='要在%(min)d和%(max)d之间')
],
render_kw={'class': 'form-control'},
id='password'
)
repassword = simple.PasswordField(
label='确认密码',
validators=[
validators.EqualTo('password', message='密码不一致')
] # 判断两次密码是否相等,第一个参数是密码字段但要写在引号里面
)
email = simple.StringField(
label='电子邮箱',
validators=[
validators.Email(message='邮箱格式不正确,如:1234@163.com')
]
)
# 多选是核心功能里面的
hobby = core.SelectMultipleField(
label='爱好',
choices=[
(1, '小姐姐'),
(2, '小萝莉'),
(3, '御姐'),
(4, '太妹'),
],
default=[1, 3],
# choices第一个参数是int类型,所以这里要指定int
coerce=int
)
# 单选也是核心功能里面的
gender = core.SelectField(
label='性别',
choices=[
(1, 'male'),
(2, 'female'),
],
default=1,
coerce=int
) @app.route('/register', methods=['GET', 'POST'])
def register():
if request.method == 'GET':
print('能不能走到这!')
form_obj = RegisterForm()
return render_template('form_register.html', form_obj=form_obj)
else:
form_obj = RegisterForm(request.form)
if form_obj.validate():
return f'恭喜{form_obj.data.get("username")}注册成功!'
else:
return render_template('form_register.html', form_obj=form_obj) if __name__ == '__main__':
app.run(debug=True)