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

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. Webpack 4 SplitChunksPlugin配置方案(转)

    通常情况下我们的 WebApp 是有我们的自身代码和第三方库组成的,我们自身的代码是会常常变动的,而第三方库除非有较大的版本升级,不然是不会变的,所以第三方库和我们的代码需要分开打包,我们可以给第三方 ...

  2. 批量删除sql语句

    SET @I = 148;SELECT CONCAT("DELETE FROM supplier_change_log WHERE old_supplier_id=4194 AND id&g ...

  3. Unity3D 使用SQLite

    使用Unity操作SQLite,需要用到三个库文件,分别是Mono.Data.Sqlite.dll和System.Data.dll和Sqlite3.dll,前两个库文件可以在unity中找到,具体步骤 ...

  4. layui 自定义模块

    新建模块目录modules 新建common.js layui.define(['jquery'], function (exports) { var $ = layui.jquery; var ob ...

  5. IDEA更改JavaScript版本

    最好改两个地方 File -> File -> -- --

  6. Java学习笔记二——正则表达式

    Java正则表达式 正则表达式的规则 “abc” 匹配字符串abc [abc] 匹配[]里任意一个字符 [a-z]: 匹配所有小写字母中的任意一个字符 [A-Z]: 匹配所有大写字母中的任意一个字符 ...

  7. Word 插入脚注、尾注与题注 -- 视频教程(5)

    >> 视频教程链接:B站,速度快,清晰 未完 ...... 点击访问原文(进入后根据右侧标签,快速定位到本文)

  8. 小白的C++之路——结构体

    结构体与数组不同的是结构体能包含不同类型的数据,像一个综合性的仓库,更加灵活. #include <iostream> #include <string> #include & ...

  9. Mysql练习题(1)

    表名和字段------------------------------------------------------------------------------–1.学生表Student(s_i ...

  10. pytest_05_fixture之conftest.py

    前面一篇讲到用例加setup和teardown可以实现在测试用例之前或之后加入一些操作,但这种是整个脚本全局生效的,如果我想实现以下场景: 用例1需要先登录,用例2不需要登录,用例3需要先登录.很显然 ...