Flask--特殊装饰器, CBV, 三方组件

一. 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)

 

posted @ 2019-04-11 19:51  一个很善良的抱爱  阅读(224)  评论(0编辑  收藏  举报