钩子函数和装饰器路由实现
before_request 每次请求都会触发
before_first_requrest 第一次请求前触发
after_request 请求后触发 并返回参数
teardown_request 失败后触发 并返回异常 需要传入参数接收
from flask import Flask, request # 设置对象 app = Flask(__name__, static_url_path='/python27', static_folder='static', template_folder='templates') # 第一次请求之前都会调用 例如mysql连接 @app.before_first_request def before_first_request(): print("before_first_request") # 每次请求都会被调用 @app.before_request def before_request(): print("before_request") # request.remote_addr 用户访问IP地址 # 判断如果访问地址在黑名单内 就return 黑名单 if request.remote_addr == "127.0.0.1": return "黑名单" # 请求之后会调用 并且在函数里面接收一个参数 响应 @app.after_request def after_request(response): print("after_request") # 对响应数据进行统一处理 response返回数据为return数据 return response # 请求失败之后会调用函数 并且将异常传入参数 @app.teardown_request def teardown_request(error): print("teardown_request") return error @app.route('/') def index(): return "hello wowlrd" if __name__ == '__main__': app.run(host='127.0.0.1', port=8888, debug=True)
werkzeug工具集
Request response routing模块 other
routing模块: Rule Map BaseConverters MapAdapter
Request 常用属性
data form args cookies headers methods url files
app.route("/data", methods=['POST'])
def data():
data = request.data
print(data)
return "ok"
from flask import Flask, request app = Flask(__name__) @app.route("/") def index(): return "index" @app.route('/data', methods=['POST']) def data(): data = request.data print(data) return 'ok' @app.route("/upload", methods=['POST']) def upload(): file = request.files.get("pic") file.save("aaa.jpg") return "success" if __name__ == '__main__': app.run(debug=True)
状态保持
无状态:http 无状态协议 每次请求独立, 协议对事务没有记忆能力, 同一个url请求 没有上下文关系
解决无状态协议问题
客户端 cookie 服务器端 session
cookie 不同网站之间cookie不能共享 同源策略 、设置获取cookie 浏览器会自动保存cookie 、
request.cookie.get("passwd") #获取cookie值
response = make_response("success") # 设置对象
respnse.set_cookie("passwd","qwe", max_age = 3600) #设置cookie值 # 设置过期时间 max_age最大连接时间3600秒
response.delete_cookie("passwd") 删除cookie 登出
from flask import Flask, request, make_response app = Flask(__name__) @app.route("/") def index(): username = request.cookies.get('username') passwd = request.cookies.get('userpass') return "%s ----- %s" % (username, passwd) @app.route("/login") def login(): response = make_response("success") response.set_cookie("username", "laowang") response.set_cookie("userpass", "123") return response if __name__ == '__main__': app.run(debug=True)
服务器端 session 存放敏感信 session依赖cookie
session需要设置 app.config["SECRET_KEY"] = "AWDWDAIJIAJCWJAI"
session可以放在url中
# 设置session
app.config["SECRET_KEY"] = "qwniassnidiajs"
session["user_name"] = "laowang"
session["user_id"] = "123456"
# 获取session 如果没有 返回值为空
user_id = session.get("user_id", '')
user_name = session.get("user_name", '')
# 删除session 如果已经删除 返回值为none
session.pop("user_id", None)
session.pop("user_name", None)
from flask import Flask, request, session app = Flask(__name__) # session 加密 使用 必须大写 app.config['SECRET_KEY'] = "adwdawdaanvoirjaowe" # 获取 session @app.route("/") def index(): # session 依赖 cookie user_id = session.get("user_id", '') user_name = session.get("user_name", '') # 返回到页面 return "%s + %s" % (user_id, user_name) # 登陆 传输session @app.route('/login') def login(): session['user_id'] = "1" session["user_name"] = "laowang" return "session" # 登出 删除session @app.route("/logout") def logout(): session.pop("user_id" , None) session.pop("user_name", None) return "success" if __name__ == '__main__': app.run(debug=True)
请求上下文 request context 请求发生时 可以使用
应用上下文 application context 应运启动时 可以使用
app = Flask(__name__) ------> 相等于current_app
app.route('/') def login(): print(request.method) print(current_app.config.get("DEBUG"))
未完待续