【发布时间】:2018-07-21 07:05:36
【问题描述】:
我正在 Flask、sqlalchemy 和 cx_Oracle 之上运行一个 flask-rest-jsonapi 应用程序。该项目的一个要求是,通过 cx_Oracle (relevant documentation) 提供的连接属性 client_identifier 可以根据每个客户端请求在 JWT 中发送的值进行修改。我们需要能够写入此属性,因为我们的内部审计表利用它来跟踪单个用户所做的更改。
在 PHP 中,setting this value is straightforward 使用 oci8,过去对我们非常有用。
但是,我一直无法弄清楚如何使用这种新的应用程序结构设置相同的属性。在 cx_Oracle 中,client_identifier 属性是一个“只写”属性,因此如果不去后端并检查数据库会话属性,就很难验证该值是否设置正确。您可以通过 sqlalchemy raw_connection 对象访问此属性。
除了难以阅读之外,设置该值没有任何效果。我们从每个请求传入的 JWT 中获取所需的客户端标识符值,并尝试在原始连接对象上设置它。虽然设置值的操作不会引发错误,但该值不会显示在相关会话的后端,即在 db 端查看会话时,client_identifier 属性为空。
from flask import Flask, jsonify, request
from flask_sqlalchemy import SQLAlchemy
app = Flask(__name__)
db = SQLAlchemy(app)
# the client_identifier property is available at db.engine.raw_connection()
# attempt to set the client_identifier property
raw_conn = db.engine.raw_connection()
raw_conn.client_identifier = 'USER_210'
# execute some sql using raw_conn.cursor()...
# the client identifier value on the db side for this request is null
上面显示的方法是设置client_identifier的正确方法吗?如果是这样,使用v$session 视图查询后端会话表时,为什么USER_210 没有列在client_identifier 列中?
【问题讨论】:
标签: python flask sqlalchemy cx-oracle