• Flask模板请求响应对象的属性和方法以及cookie和session


    模板

    # 之前学的完全一样,for,if, 
    # 模板语言支持函数加括号执行
    
    # 模板有没有处理xss攻击,在页面显示标签,内部怎么实现的?
        -1 模板层   要渲染的字符串|safe
        -2 后端:Markup('<input type="text">')
    # Markup等价django的mark_safe ,
    
    # extends,include一模一样

    定义全局模板公共方法

    注意:在蓝图中注册时候,应用范围只有本蓝图。

    mb_test.py

    from flask import Flask, render_template
    
    
    app=Flask(_name_,)
    
    @app.template_global()  # 模板中调用方法:{{ func("赵海宇") }}
    def func(arg):
        return'海狗子' + arg
    
    @app.template_filter()  # 模板中调用方法:{{ "赵海宇"|x1() }}
    def x1(arg):
        return'海狗子' + arg  
    
    @app.route('/md/hg')
    def index():
        return render_template('md_hg.html')
    
    if __name__ == 'main':
        app.run()

    md_hg.html

    <!DOCTYPE html>
    <html lang="en">
    <head>
    <meta charset="UTF-8">
    <title>Title</title>
    </head>
    <body>
    
    <h1>MDHG</h1>
    {{ func("赵海宇") }}
    {{ "赵海宇"|x1() }}
    </body>
    </html>

    flask特殊装饰器

    before_request  请求来的时候先执行before_request装饰的函数,再执行视图,不能有返回值

    after_request  请求走的时候执行,需要返回值response

    from flask import Flask, render_template
    
    app = Flask(__name__)
    
    
    @app.before_request
    def f1():
        print('f1')
    
    
    @app.after_request
    def f10(response):
        print('f10', '----->', response)
        return response
    
    @app.route('/index')
    def index():
        print('index')
        return render_template('index.html')
    
    
    if __name__ == '__main__':
        app.run()

    注意:before和after request可以在蓝图中定义,在蓝图中定义的话,作用域只在本蓝图。

    装饰器小细节

    from flask import Flask, render_template
    
    app = Flask(__name__)
    
    
    @app.before_request
    def f1():
        print('f1')
    
    
    @app.after_request
    def f10(args):
        print('f10', '----->', args)
        return args
    
    
    def x1():
        print('x1')
    
    
    app.before_request(x1)    # before_request或者after_request也可以这样玩
    
    
    @app.route('/index')
    def index():
        print('index')
        return render_template('index.html')
    
    
    if __name__ == '__main__':
        app.run()

    request对象的属性和方法

    参考:https://www.cnblogs.com/pure3417/p/14799899.html

    # request.method  提交的方法
    # request.args  get请求提及的数据,使用:request.args.get('pk')
    # request.form   post请求提交的数据,使用:request.form.get('name')
    # request.values  post和get提交的数据总和
    # request.cookies  客户端所带的cookie
    
    # request.headers  请求头
    # request.path     不带域名,请求路径
    
    # # request.full_path  不带域名,带参数的请求路径
    
    # request.url           带域名带参数的请求路径
    
    # request.base_url        带域名请求路径
    # request.url_root      域名
    # request.host_url        域名
    # request.host            127.0.0.1:500
    # request.files
    # obj = request.files['the_file_name']
    # obj.save('/var/www/uploads/' + secure_filename(f.filename))

    响应对象方法

    # 响应对象
    # 响应相关信息
    # return "字符串"
    # return render_template('html模板路径',**{})
    # return redirect('/index.html')
    # 对着django,JsonResponse
    # return jsonify({'k1':'v1'})
    
    aa='hello world'
    res=make_response(aa)
    res.set_cookie('xxx','lqz')
    # 往响应头中放东西
    res.headers['X-Something'] = 'A value'
    print(type(res))
    from  flask.wrappers import Response
    return res
    
    # response = make_response(render_template('index.html'))
    # response是flask.wrappers.Response类型
    # response.delete_cookie('key')
    # response.set_cookie('key', 'value')
    # response.headers['X-Something'] = 'A value'
    # return response
    # return 'hello'

    补充:

    varchr :65535个字节的数据
     -utf8:中文2个字节,varchar(300-utf8mb4:3个字节,varchar(300# 快速导出requestment.txt
    pip3 install pipreqs
    # pipreqs ./ --encoding=utf-8

    cookie和session

    res=make_response('hello world')
    res.set_cookie('xxx','lqz')            # 设置cookie
    res.delete_cookie('key')            # 删除
    
    # 全局导入
    # 视图函数中 session['key']=value
    # 删除:session.pop('key')
    # 取:session['key']
    
    # open_session
    # save_session
    
    注意事项:
    # session需要配置secret_key
    app.secret_key = 'sdfsdf'
    
    示例:
    from flask import Flask,session
    
    app = Flask(__name__)
    app.secret_key = 'sdfsdf'
    
    
    @app.route('/')
    def index():
        session['k1'] = 'v1'
    
    if __name__ == '__main__':
        app.run()

     请求扩展

    # 请求扩展类似django中的中间件
    
    
    # 1 请求来了就会触发,类似于django的process_request, 如果有多个,顺序是从上往下
    @app.before_request
    def before(*args, **kwargs):
        if request.path=='/login':
            return None
        else:
            name=session.get('user')
            if not name:
                return redirect('/login')
            else:
                return None
            
    # 2 # 请求走了就会触发,类似于django的process_response,如果有多个,顺序是从下往上执行
    @app.after_request
    def after(response):
        print('我走了')
        return response
    
    #3 before_first_request 项目启动起来第一次会走,以后都不会走了,也可以配多个(项目启动初始化的一些操作)
    @app.before_first_request
    def first():
        print('我的第一次')
        
        
    # 4 每次视图函数执行完了都会走它,# 用来记录出错日志
    @app.teardown_request  # 用来记录出错日志
    def ter(e):
        print(e)
        print('我是teardown_request ')
    
        
    # 5 errorhandler绑定错误的状态码,只要码匹配,就走它
    @app.errorhandler(404)
    def error_404(arg):
        return render_template('error.html',message='404错误')
    
    # 6 全局标签
    @app.template_global()
    def sb(a1, a2):
        return a1 + a2
    # 在模板中:{{ sb(3,4) }}
    
    # 7 全局过滤器
    @app.template_filter()
    def db(a1, a2, a3):
        return a1 + a2 + a3
    # 在模板中{{ 1|db(2,3)}}
    
    
    
    1 before_request 请求来时执行,和django中间件中的process_request类似
    2 after_request,请求走时执行,接收response参数,需要return response
    
    3 注意有多个的情况,执行顺序;before_request 从上往下;after_request从下网上
    
    4 before_request请求拦截后,也就是有return值,如果返回一个response对象则直接返回不在往下执行,但是所有的after_request都会执行。这一点和django中间件的process_response不同
  • 相关阅读:
    Confluence wiki——CentOS6.8搭建详解
    ifconfig不显示网卡eth0
    VMware vSphere克隆虚拟机
    VMware ESXI6.0服务器安装
    虚拟化技术的基本介绍
    HTTP协议详解
    Shell中的case命令
    Linux通过ssh登录其他服务器,不用输入密码
    Linux下/etc/passwd、/etc/shadow、/etc/group文件
    Linux挂载详解
  • 原文地址:https://www.cnblogs.com/baicai37/p/16447414.html
Copyright © 2020-2023  润新知