FBV
def index(nid):
""" 请求相关信息 request.method # 请求方式 request.args # get 方式的参数获取 request.form # post 方式的参数获取 request.values request.cookies request.headers request.path # 请求资源路径 request.full_path # 请求全部资源漫画 request.script_root request.url # 全部请求路径 (带协议带域名) request.files # 请求文件 obj = request.files['the_file_name'] obj.save('/var/www/uploads/' + secure_filename(f.filename))
"""
dic = {"k1":"v1"}
""" 返回响应体的4种形式 字符串 jsonify 模板 跳转 url """
# return "index"
# return jsonify(dic) # return render_template("xxx.html",dic=dic) # 可带数据传递 # return redirect(url_for("index")) # 跳转通过 url_for 反向解析
""" 定制响应头的时候构造响应体用到 make_response """
# 如果想设置响应头和回显cookie,就需要用到make_response
# response = make_response(render_template('index.html'))
# response = make_response("字符串")
# response是flask.wrappers.Response类型
# response.delete_cookie('key')
# response.set_cookie('key', 'value')
# response.headers['X-Something'] = 'A value'
# return response
from flask import make_response,headers,set_cookie obj = make_response(jsonify(dic)) obj.headers["xxxxx"] = "123" obj.set_cookie("key","value") return obj
装饰器实现中间件功能
预备处理视图函数初始状态
@app.route('/index') def index(): if not session.get('user'): return redirect(url_for('login')) return render_template('index.html',stu_dic=STUDENT_DICT)
视图级别加装,比较适用于对少量视图进行处理
import functools def auth(func): @functools.wraps(func) def inner(*args,**kwargs): if not session.get('user'): return redirect(url_for('login')) ret = func(*args,**kwargs) return ret return inner @app.route('/index') @auth def index(): return render_template('index.html',stu_dic=STUDENT_DICT)
全局级别加装
@app.before_request def xxxxxx(): if request.path == '/login': return None if session.get('user'): return None return redirect('/login')
除了 before_request 以外还有其他特殊装饰器:
1. before_request 谁先定义谁先执行 执行多个 before 的时候如果再中间有返回值,对于after 的执行直接执行最后一次定义的那个 2. after_request 谁后定义谁执行 3. before_first_request 4. template_global 5. template_filter 6. errorhandler
from flask import Flask app = Flask(__name__) @app.before_request def x1(): print('before:x1') return '滚' @app.before_request def xx1(): print('before:xx1') @app.after_request def x2(response): print('after:x2') return response @app.after_request def xx2(response): print('after:xx2') return response @app.route('/index') def index(): print('index') return "Index" @app.route('/order') def order(): print('order') return "order" if __name__ == '__main__': app.run()