zoukankan      html  css  js  c++  java
  • 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)
  • 相关阅读:
    Spring中的资源加载
    分布式系统Paxos算法
    MySQL中MyISAM与InnoDB区别及选择(转)
    Unable to construct api.Node object for kubelet: can't get ip address of node master.example.com: lookup master.example.com on : no such host
    分库情况下的数据库连接注入
    Core源码(二) Linq的Distinct扩展
    B-Tree详解
    C#进阶之路(八)集合的应用
    重温CLR(十八) 运行时序列化
    重温CLR(十七)程序集加载和反射
  • 原文地址:https://www.cnblogs.com/attila/p/10691975.html
Copyright © 2011-2022 走看看