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

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"))

未完待续

【Flask】 python学习第一章 - 4.0 钩子函数和装饰器路由实现 session-cookie 请求上下文的更多相关文章

  1. python学习之路-4 内置函数和装饰器

    本篇涉及内容 内置函数 装饰器 内置函数 callable()   判断对象是否可以被调用,返回一个布尔值 1 2 3 4 5 6 7 8 9 10 11 num = 10 print(callabl ...

  2. 【Flask】 python学习第一章 - 5.0 模板

    jinjia2 模板 python实现 flask 内置语言  参照Djago实现  设置模板文件夹 设置模板语言 jinja2 demo6_template.html  ----> 从代码渲染 ...

  3. 【Flask】 python学习第一章 - 6.0 WTF表单 数据库 蓝图

    WTF表单  wtf.py pip install flask-wtf  # 安装 from flask_wtf import FlaskForm from wtform import StringF ...

  4. 【Flask】 python学习第一章 - 2.0 视图方式和返回值

    路由参数与请求方式制定   ALT+回车 pycharm 快速导包  demo3  指定访问地址  与请求方式  #   给路由传入参数 使用尖括号 ,视图函数需要接收参数 @app.route(&q ...

  5. 【Flask】 python学习第一章 - 3.0 正则转换和错误捕捉

    3.1正则转换器定义 Class RegexConverter(BaseConverter): regex = "[0-9]{6}" app.url_map.converters[ ...

  6. 【Flask+Redis】 python学习第一章 - 7.0 断言 数据库测试 redis学习

    assert 断言 def div(num1, num2): # 断言 assert isinstance(num1, int), "值类型错误" assert isinstanc ...

  7. Fastify 系列教程二 (中间件、钩子函数和装饰器)

    Fastify 系列教程: Fastify 系列教程一 (路由和日志) Fastify 系列教程二 (中间件.钩子函数和装饰器) 中间件 Fastify 提供了与 Express 和 Restify ...

  8. Fastify 系列教程二 (中间件、钩子函数和装饰器)

    Fastify 系列教程: Fastify 系列教程一 (路由和日志) Fastify 系列教程二 (中间件.钩子函数和装饰器) Fastify 系列教程三 (验证.序列化和生命周期) Fastify ...

  9. 【Flask】 python学习第一章 - 创建与运行参数

    windos 创建环境 sudo pip install virtualenv   # 安装virtualenv virtualenv -p python dir_name cd dir_name p ...

随机推荐

  1. 【Spring Boot学习之五】切面日志管理

    环境 eclipse 4.7 jdk 1.8 Spring Boot 1.5.2 一.log4j 常见方式:log4j.properties + org.apache.log4j.Logger比如:l ...

  2. 在Grafana使用普罗米修斯

    aaarticlea/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KPCEtLSBHZW5lcmF0b3I6IE ...

  3. 资源池-数据库连接池简单实现-JAVA版本

    转载:https://www.jianshu.com/p/381c86bdbff6 看了看druid和dbcp2的原码,发现他们都有各自存储连接的方式. druid : private volatil ...

  4. JAVA 8 的新特性

    Java8的新特性有:默认方法.函数式接口.lambda表达式.方法引用.Stream.Optional.日期API. 一.默认方法: 接口中的方法可以有方法体,但是必须要有static或者defau ...

  5. JavaWeb项目之多条件过滤

    相信很多同学在学习java基础之后,面对各种项目还是相当头疼,那今天我将手把手教你学会JavaWeb项目中的多条件过滤,希望你能在与我实战的过程中积累经验,更进一步. 分页查询 需求分析:在列表页面中 ...

  6. RHEL6.5 移植使用CentOS 的YUM 步骤

    问题:使用 Red Hat Enterprise Linux Server(RHEL) yum安装软件时显示 This system is not registered with RHN. RHN s ...

  7. 删除elasticsearch 30天前的所有索引

    我的索引格式为 xxx-xxx-xxx-2019.06.27 xxx-xxxx-2019.06.27 脚本思路: 获取目前 es上所有索引,以日期进行拆分,然后用索引时间对比一个月前的日期,日期小于一 ...

  8. TCP协议学习笔记

    TCP协议数据格式 TCP协议在互联网ISO协议的传输层. 在互联网传输过程中,互联网包在数据链路层,是传输数据的最基础的包.一个互联网的包包含IP包,即互联网包 = 互联网信息包头(至少20字节)+ ...

  9. 如何配置这个maven仓库的源http://mvnrepository.com/repos

    http://mvnrepository.com/repos 主要是ID .mirrorof.name 怎么配置,这个网站上有spring5.0的,别的仓库没有,我需要这个源. 原文地址:https: ...

  10. Huber Loss 介绍

    Huber Loss 是一个用于回归问题的带参损失函数, 优点是能增强平方误差损失函数(MSE, mean square error)对离群点的鲁棒性. 当预测偏差小于 δ 时,它采用平方误差,当预测 ...