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

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. 解决catalina.out文件过大的问题

    有用Tomcat的人,绝对都会遇到这样一个问题:catalina.out文件过大. 它是Tomcat默认生成的日志文件,会随着时间的推移,逐渐增大,不断的增长,甚至达到几G,几十G的大小.由于文件过大 ...

  2. Redis 分布式锁的正确实现方式(Java版)[转]

    本文来源: https://www.cnblogs.com/linjiqin/p/8003838.html 前言 分布式锁一般有三种实现方式: 数据库乐观锁: 基于Redis的分布式锁: 基于ZooK ...

  3. c# .net framework 4.5.2 , Quartz.NET 3.0.7

    参考了:https://www.cnblogs.com/personblog/p/11277527.html, https://www.jianshu.com/p/b8e7e4deb60a .NET ...

  4. leetcode刷题系列(一) 26题 删除排序数组中的重复项

    题干 给定一个排序数组,你需要在原地删除重复出现的元素,使得每个元素只出现一次,返回移除后数组的新长度. 不要使用额外的数组空间,你必须在原地修改输入数组并在使用 O(1) 额外空间的条件下完成. 示 ...

  5. LeetCode 394. 字符串解码(Decode String) 44

    394. 字符串解码 394. Decode String 题目描述 给定一个经过编码的字符串,返回它解码后的字符串. 编码规则为: k[encoded_string],表示其中方括号内部的 enco ...

  6. OpenLayers加载高德地图离线瓦片地图

    本文使用OpenLayers最新版本V5.3.0演示:如何使用OpenLayer加载谷歌地球离线瓦片地图.OpenLayers 5.3.0下载地址为:https://github.com/openla ...

  7. QT 学习基础问题记录

    1. connect 函数 需要先创建发送者和接收者实例,并且信号函数和槽函数如果有参数,需要在 connect 函数使用时指定相关参数类型. 2.窗口控件设置 设置窗口的最大化.最小化.问号提示等控 ...

  8. Linux查看CPU信息计算CPU核数量

    1. 物理CPU的个数: cat /proc/cpuinfo | grep "physical id" | sort | uniq | wc -l 2. 每个物理CPU的核心数量: ...

  9. Jenkins基于https的k8s配置

    一.摘要 jenkins 连接低版本的k8s时,不需要验证.但是新版本的启用了https和角色管理 二.安装kubernetes插件 登录jenkins,点击 Manage Jenkins --> ...

  10. nginx+lua访问流量实时上报kafka

    在nginx这一层,接收到访问请求的时候,就把请求的流量上报发送给kafka storm才能去消费kafka中的实时的访问日志,然后去进行缓存热数据的统计 从lua脚本直接创建一个kafka prod ...