108、闪现 、请求扩展 、g对象

124 阅读3分钟

今日内容概要

  • 闪现
  • 请求扩展
  • g对象

今日内容详细

闪现

1.一个请求--->假设出错了--->重定向到另一个地址--->把错误信息在另一个返回中看到
错误信息放个位置---->另一个请求过来,去那个位置拿
	把一些数据,放在某个位置--->后期可以去取出来---->取完不用删除,就没了
2.代码:
  @app.route('/')
  def index():
      return redirect('/errors')


  @app.route('/errors')
  def error():
      return render_template('index.html')

3.闪现
	1.设置:flash('aaa')
	2.取值:get_flashed_message()
	3.分类放:flash('超时错误', category="x1")
	4.分类取:data = get_flashed_messages(category_filter=['x1'])

4.django 的message就是做这个事的
5.闪现有什么用?
	1.暂时存数据
  2.当次请求出错了,下次请求要显示这个错误

代码

from flask import Flask,flash,get_flashed_messages
  app = Flask(__name__)
  app.debug = True
  app.secret_key = 'fdsgdfgbdfd'  # 只要用闪现--->就要设置secret_key---->放到session中了

  @app.route('/')
  def index():
      flash('nana')
      return 'ok'

  @app.route('/home')
  def home():
      name = get_flashed_messages()
      print(name)  # ['nana'],再访问就没了
      return 'home'

  if __name__ == '__main__':
      app.run()
from flask import Flask,flash,get_flashed_messages


app = Flask(__name__)
app.debug = True

app.secret_key = 'fdsgdfgbdfd'  # 只要用闪现--->就要设置secret_key---->放到session中了

@app.route('/')
def index():
    flash('超时错误',category='x1')
    return 'ok'


@app.route('/home')
def home():
    name = get_flashed_messages(category_filter=['x1'])
    print(name)  # ['nana'],再访问就没了
    return 'home'


@app.route('/func1')
def func1():
    name = get_flashed_messages(category_filter=['x2'])
    print(name)  # ['nana'],再访问就没了
    return 'func1'

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

请求扩展

1.flask的请求扩展,类似于django中的中间件
2.请求来了,请求走了,做一些拦截
  1.before_request  # 每个请求来了,都会走
  2.after_request
  3.before_first_request
  4.teardown_request
  5.errorhandler
  6.template_global
  7.template_filter
        

before_request

请求来了执行--->process_request--->可以下多个,从上往下依次执行

类比django中间件中的process_request,在请求收到之前绑定一个函数做一些事情

1.返回None,会执行下一个请求扩展,如果返回4件套,直接就返回了,不再往下执行了
2.多个before_request,从上往下执行
from flask import Flask,request,render_template

app = Flask(__name__)
app.debug = True

app.secret_key = 'fdsgdfgbdfd'

@app.before_request
def before():
    # 当次的请求对象就是request
    # 返回None,会执行下一个请求扩展,如果返回4件套,直接就返回了,不再往下执行了
    # 1.判断当前的路进
    # if request.path =='/':
    #     print('可以访问')
    # else:
    #     print('不可以访问')
    #     return render_template('error.html')

    # 2.判断如果是跟路径,向request对象中放个name,其他不放
    # if request.path == '/':
    #     request.name ='nana'
    print('1111来了')

@app.before_request
def suibian():
    print('2222来了')

@app.route('/')
def index():
    # print(request.name)
    return 'ok'

@app.route('/home')
def home():

    # print(request.name)  # 报错
    return 'home'

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

after_request

类比django中间件中的process_response,每一个请求之后绑定一个函数,如果请求没有异常

1.作用:可以处理跨域
from flask import Flask,request,render_template
app = Flask(__name__)
app.debug = True

app.secret_key = 'fdsgdfgbdfd'

@app.before_request
def suibian():
    print('2222来了')


@app.after_request
def after1(response):
    # 1.处理跨域
    response.headers['token']='dsafcdfvdg'
    
    # 2.多个before_request,从上往下执行
    print('111走了')
    return response

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

"""
1111来了
2222来了
222走了
111走了
"""

@app.route('/')
def index():
    # print(request.name)
    return 'ok'

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

before_first_request

第一次请求时,跟浏览器无关

@app.before_first_request
def first():
    pass

teardown_request

每一个请求之后绑定一个函数,即使遇到了异常--->一般用来记录日志--->不能做统一异常处理

from flask import Flask,request,render_template,jsonify
app = Flask(__name__)
app.debug = True
app.secret_key = 'fdsgdfgbdfd'

@app.teardown_request
def tear(e):
    print(e) # 出了异常,e就是异常对象,如果没有异常,e就是None
    if e:  # 不能做统一异常处理
        return jsonify({'code':101,"msg":'错了'})  # 还是报错

@app.route('/')
def index():
    # print(request.name)
    a = [1,2,3]
    print(a[4])
    return 'ok'

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

errorhandler

路径不存在时404,服务器内部错误500

from flask import Flask,request,render_template,jsonify,redirect
app = Flask(__name__)
app.debug = True
app.secret_key = 'fdsgdfgbdfd'

@app.errorhandler(404)
def err(e):
    # print(e)
    err_msg=e
    return render_template('error.html',err_msg=err_msg)



@app.route('/')
def index():

    return redirect('/login')

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

template_global

1.template_global 全局标签,所有页面都可以用
@app.template_global()
def add(a1, a2):
    return a1 + a2
  
"""
<h1>{{add(4,5)}}</h1>
"""

template_filter

2.template_filter 全局过滤器
@app.template_filter()
def db(a1, a2, a3):
    print(a1)
    return a1 + a2 + a3
  
"""
{{4|db(5,6)}}
"""

g对象

1.请求来了,在request中放个path,后续的视图函数中都能拿到
2.flask不建议向request对象中放变量,建议使用g对象
3.g对象,当次请求中放入的变量,在当次请求中一直存在
4.global的缩写,global
5.g和session的区别
	g只针对于当次请求
  session可以跨请求
from flask import Flask, flash, get_flashed_messages, request, render_template, jsonify, g

app = Flask(__name__)

@app.before_request
def before():
    if request.path == '/':
        g.path = 'lqz'

def test():
    print("test", g.path)

def add():
    return g.a + g.b

@app.route('/')
def index():
    print(g.path)
    test()
    g.a = 10
    g.b = 100
    add()
    print(g.a)
    return 'index'

@app.route('/home')
def home():
    print(g.path)  # 没有的
    return 'home'

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