一. 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)
1 from flask import Flask, request, render_template
2
3 app = Flask(__name__)
4 # simple是简单使用, core是核心功能
5 from wtforms.fields import simple, core
6 from wtforms import Form
7 from wtforms import validators
8
9 class RegisterForm(Form):
10 username = simple.StringField(
11 label='用户名',
12 validators=[
13 validators.DataRequired(message='不能为空'),
14 validators.Length(max=16, min=6, message='要在%(min)d和%(max)d之间')
15 ],
16 # 使用bootstrap的时候,添加样式
17 render_kw={'class': 'form-control'},
18 id='username'
19 )
20 password = simple.PasswordField(
21 label='密码',
22 validators=[
23 validators.DataRequired(message='不能为空'),
24 validators.Length(max=16, min=6, message='要在%(min)d和%(max)d之间')
25 ],
26 render_kw={'class': 'form-control'},
27 id='password'
28 )
29 repassword = simple.PasswordField(
30 label='确认密码',
31 validators=[
32 validators.EqualTo('password', message='密码不一致')
33 ] # 判断两次密码是否相等,第一个参数是密码字段但要写在引号里面
34 )
35 email = simple.StringField(
36 label='电子邮箱',
37 validators=[
38 validators.Email(message='邮箱格式不正确,如:1234@163.com')
39 ]
40 )
41 # 多选是核心功能里面的
42 hobby = core.SelectMultipleField(
43 label='爱好',
44 choices=[
45 (1, '小姐姐'),
46 (2, '小萝莉'),
47 (3, '御姐'),
48 (4, '太妹'),
49 ],
50 default=[1, 3],
51 # choices第一个参数是int类型,所以这里要指定int
52 coerce=int
53 )
54 # 单选也是核心功能里面的
55 gender = core.SelectField(
56 label='性别',
57 choices=[
58 (1, 'male'),
59 (2, 'female'),
60 ],
61 default=1,
62 coerce=int
63 )
64
65 @app.route('/register', methods=['GET', 'POST'])
66 def register():
67 if request.method == 'GET':
68 print('能不能走到这!')
69 form_obj = RegisterForm()
70 return render_template('form_register.html', form_obj=form_obj)
71 else:
72 form_obj = RegisterForm(request.form)
73 if form_obj.validate():
74 return f'恭喜{form_obj.data.get("username")}注册成功!'
75 else:
76 return render_template('form_register.html', form_obj=form_obj)
77
78 if __name__ == '__main__':
79 app.run(debug=True)