请求与响应、闪现、请求扩张、中间件等等
请求与响应
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))
#如果传多了就会报错了。
注意:偏函数的传参方式严格按照传参规则来