zoukankan      html  css  js  c++  java
  • Flask入门之二

    Flask入门之二

    request对象方法

    与django类似,在视图函数中使用,只不过不需要在入参里写request

    from flask import Flask
    from flask import request
    from flask import render_template
    from flask import redirect
    from flask import make_response
    
    app = Flask(__name__)
    
    
    @app.route('/login.html', methods=['GET', "POST"])
    def login():
        # 请求相关信息
        # request.method  提交的方法:GET/POST
        # request.args  get请求提及的数据
        # request.form   post请求提交的数据
        # request.values  post和get提交的数据总和
        # request.values.getlist('name') 数据中有重名的变量时,这样可以返回一个名为name的值的列表
        # 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 "内容"
    
    if __name__ == '__main__':
        app.run()
    

    response对象方法

    直接使用,看不到response对象,可以使用make_response获得这个对象,然后操作cookie,请求头一类的

    from flask import Flask,jsonify,make_response
    # 上一篇博客里讲的lowb三板斧
    return "字符串"
    return render_template('html模板路径',**{})
    return redirect('/index.html')
    
    # 相当于django中的JsonResponse,需要在flask导入
    # 放一个字典,可以转成json字符串
    return jsonify({'k1':'v1'})
    
    aa='hello world'
    # 返回aa,但是aa不是django中的response对象,如果要设置cookie,需要一个对象去set_cookie
    res=make_response(aa)
    # 用make_response生成一个对象,在这里设置cookie
    res.set_cookie('xxx','lqz')
    # 往响应头中放东西
    res.headers['X-Something'] = 'A value'
    print(type(res))
    
    response = make_response(render_template('index.html'))
    response是flask.wrappers.Response类型
    # 删除cookie
    response.delete_cookie('key')
    return response
    

    Session

    from flask import Flask,session
    SECRET_KEY = 'abc'
    # 使用session,必须配置一个secret_key,否则报错
    # 导入session
    # 视图函数中像操作字典一样操作session 
    session['key']=value
    # 删除
    session.pop('key')
    # 取
    session['key']
    

    内置的session,flask直接当作cookie,加密一下返回给浏览器了,如果想存redis或者别的操作,可以指定session类,自己写类或者用第三方完成扩展

    app.session_interface = 自己写的或第三方类
    
    # 类需要重写三个方法:
    open_session
    # 请求来,获取cookie的值到一个字典中,如果没有值,返回一个空,有值,则用get_signing_serializer解码
    
    save_session
    # 请求走,把内容,过期时间等信息加密放进cookie里
    # 内部有监测session.modified,是否session有被动过,动过了就更新整个session(过期时间一类的会刷新)
    
    get_signing_serializer
    # 获取secret_key 里面有load和dump方法,可以加密或者解密
    
    

    闪现

    基于session实现的,所以使用闪现,必须要有secret_key。在一个请求中设置闪现,可以在后面的请求里拿到这个闪现的值。

    from flask import Flask, flash
    # 需要导入flash
    # 设置
    flash('aaa')
    # 取值
    get_flashed_message()
    # 设置
    flash('bbb',category='error1')
    # 取值
    res=get_flashed_messages(category_filter=['error1'])
    # 假设在a页面操作出错,跳转到b页面,在b页面显示a页面的错误信息
    

    注意如果闪现多个值,可以一次取出来,下次再取就取不到了(一次性的消息)

    请求扩展

    类似于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)}}
    
    • 常用的就是 before_requestafter_request,
    • 注意有多个的情况,执行顺序
    • before_request请求拦截后(也就是有return值),response所有都执行
  • 相关阅读:
    C#在窗口中ComboBox控件中加载数据库数据
    C#登录窗口(访问数据库)的制作,类文件的制作及使用
    C#通过窗体应用程序操作数据库(增删改查)
    C#在listview控件中显示数据库数据
    C#窗体与sql数据库的连接
    C#记事本的制作
    C#计算器的制作
    C#委托的初步理解
    使用Java语言开发微信公众平台(七)——音乐消息的回复
    使用Java语言开发微信公众平台(六)——获取access_token
  • 原文地址:https://www.cnblogs.com/telecasterfanclub/p/13569717.html
Copyright © 2011-2022 走看看