请求与响应、闪现、请求扩张、中间件等等

请求与响应

from flask import Flask,request,make_response,render_template

app = Flask(__name__)




@app.route('/login.html', methods=['GET', "POST"])
def login():
    # 请求相关信息
    # request.method  提交的方法
    print(request.method)
    # request.args  get请求提及的数据
    print(request.args)
    # request.form   post请求提交的数据
    print(request.form)
    # request.values  post和get提交的数据总和
    print(request.values)
    # request.cookies  客户端所带的cookie
    print(request.cookies)
    # request.headers  请求头
    print(request.headers)
    # request.path     不带域名,请求路径
    print(request.path)
    # request.full_path  不带域名,带参数的请求路径
    # request.script_root
    # 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')
    # return jsonify({'k1':'v1'})

    # 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

    #返回字符串
    #response = make_response("内容")
    #response.set_cookie("tank_love","piao")

    #返回html
    response=make_response(render_template("index.html"))
    #响应头
    response.headers['X-Something'] = 'sb'
    #返回响应的时候删除cookie里的值
    response.delete_cookie('jason')
    return response


if __name__ == '__main__':
    app.run()

闪现

'''
此闪现非彼闪现
闪现解决的问题:-假设在a页面操作出错,c页面(不管操作了多少个页面),跳转到b页面之后,在b页面显示a页面的错误信息

'''
from flask import Flask,flash,get_flashed_messages,request

app = Flask(__name__)
app.secret_key = 'asdfasdf'


@app.route('/index')
def index():
	#这里存入了一个flash
    flash('超时错误')
    #这里又存入了一个flash,但是取出的时候有所不同
    flash('李健是dsb',category="py11")
    return "ssdsdsdfsd"
    # return redirect('/error')

@app.route('/error1')
def error1():
    return "ok"

@app.route('/error')
def error():
    """
    展示错误信息
    :return:
    如果get_flashed_messages(with_category=True)
    """
    #这里第一个参数是设置返回结果是元组,或者列表套元组,True就是列表套元组,第二个参数就是取前面设置flash的时候设置了category的内容。
    data = get_flashed_messages(with_categories=True,
                                category_filter=('py11',))
    data2 = get_flashed_messages()
    print(data)
    print(data2)
    return  "ojbk"

@app.route('/error2')
def error2():
    data = get_flashed_messages()

    print("error2",data)


    return "ok1"

if __name__ == '__main__':
    app.run()



请求扩展

请求扩展:利用before_request装饰器,可以实现在请求开始之前执行多个函数,执行顺序是谁在前面就先执行谁,如果前面的before_request有返回值,后面的都不会执行了。(但是before_first_request,不会影响)

@app.before_first_request
def sb1():
    # print(request)
    print("我是请求1前的")
    #并不会让后面的before_request都不执行了。
    return '我是请求1之前的返回'

@app.before_request
def sb2():
    print('我是请求之前2')
    #如果return了,后面的before_request都不会执行了
    # return '我是请求之前2的返回'

@app.before_request
def sb3():
    print('我是请求之前3')
    # return '我是请求之前3的返回'


@app.after_request
def process_response1(response):
    print('process_response1 走了')
    return response

@app.after_request
def process_response2(response):
    print('process_response2 走了')
    return response


@app.before_first_request
def first():
   print("我的第一次")

'''
可以在请求之后添加多个after_request

执行顺序是谁在前面谁后执行
before_request对我的after_request没有影响,有没有返回值都会执行




'''
@app.after_request
def process_response1(response):
    print('process_response1 走了')
    return response

@app.after_request
def process_response2(response):
    print('process_response2 走了')
    return response


@app.before_first_request
def first():
   print("我的第一次")

teardown_request

'''
无论有没有异常都会执行,有异常会把异常传递进来

'''

@app.teardown_request
def ter(e):
    print(e)
    print("我是异常")



errorhandler

'''
@app.errorhandler(要捕获的错误码)
'''
@app.errorhandler(500)
def error_404(arg):
    print(arg)
    return "500错误了"

template_global

如果想要给前端传一个函数,按照我们传统的方法就是通过

return redirect_template('index.html',sb=sb),如果很多页面都要用,就会很麻烦,所以就有了这个,不用传,直接在前端就可以使用。

@app.template_global()
def sb(a1, a2):
    return a1 + a2

index.html

{{sb(1,2)}}

template_filter

#过滤器,比django的强大,强大在可以传多个参数
@app.template_filter()
def db(a1, a2, a3):
    return a1 + a2 + a3

index.html

//12就是要过滤的对象,会变成第一个参数传进去,后面两个也是参数。
{{12|db(1,1)}}

偏函数

什么是偏函数,就是可以暂时存档。他需要四个参数,你可以先给他传两个,下次再给他传两个。不会报错。

from functools import partial
def test(a,b,c,d):
    return a+b+c+d

tes=partial(test,a=1,b=2)

print(tes(c=3,d=4))
#如果传多了就会报错了。

注意:偏函数的传参方式严格按照传参规则来

posted @ 2019-12-16 22:41  chanyuli  阅读(116)  评论(0编辑  收藏  举报