钩子函数和装饰器路由实现

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)

data

状态保持

无状态: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", "")
return response if __name__ == '__main__':
app.run(debug=True)

获取cookie 和 设置cookie

服务器端 session   存放敏感信  session依赖cookie

session需要设置  app.config["SECRET_KEY"] = "AWDWDAIJIAJCWJAI"

session可以放在url中

# 设置session
app.config["SECRET_KEY"] = "qwniassnidiajs"
session["user_name"] = "laowang"
session["user_id"] = "" # 获取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'] = ""
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)

设置session 登陆登出

请求上下文  request context     请求发生时 可以使用

应用上下文 application context  应运启动时 可以使用 

app = Flask(__name__) ------> 相等于current_app
app.route('/')
def login():
print(request.method)
print(current_app.config.get("DEBUG"))

未完待续

最新文章

  1. hdu 1410
  2. js打印功能
  3. Android软件安全开发实践(下)
  4. 关于协程的学习 & 线程栈默认10M
  5. phpcmsv9如何实现添加栏目时不在首页内容区显示只在导航栏显示
  6. Go语言博客
  7. Microsoft SQL Server,错误:2;SQL Server配置管理器(本地)—远程过程调用失败
  8. 使用Cxf发布Webservice服务,如果待发布的接口中有重载方法,怎么处理??
  9. 闲话Android 之 屏幕大小、pixel、分辨率、dpi、dip
  10. launch failed.Binary not found
  11. 【Keras篇】---利用keras改写VGG16经典模型在手写数字识别体中的应用
  12. Make a plan
  13. SQL Sever 2008 R2版本添加Northwin数据库错误解决
  14. Mac安装6.1.2版本Elasticsearch及优化配置实践
  15. Open Daylight integration with OpenStack: a tutorial
  16. [IOS][已越狱]配合网易云音乐,使用Bridge快速免iTunes导入音乐到“音乐”
  17. 微信小程序——使用vue构建小程序【外传】
  18. SpringBoot 之热部署
  19. Flume自定义Source、Sink和Interceptor(简单功能实现)
  20. CF1092(div3):Great Vova Wall (栈)(还不错)

热门文章

  1. SSAS 项目部署失败的问题
  2. Docker是什么?
  3. [转帖]LINUX PID 1 和 SYSTEMD
  4. STL源码剖析——序列式容器#3 Deque
  5. Nginx静态服务配置---详解root和alias指令
  6. day07——数据类型补充、坑、二次编码
  7. sublime配置python环境及快捷键
  8. react-router的BrowserHistory 和 HashHistory 的区别,如何解决使用BrowserHistory 引起的访问路径问题
  9. Java子类方法签名相同,返回类型不同
  10. Java ClassLoader 学习理解