Я разрабатываю веб-приложение, которое должно войти в базу данных с учетными данными, которые предоставляются конечным пользователем; само приложение не имеет входа в базу данных.Сериализовать подключение базы данных через сеанс
Проблема заключается в том, как создать одно соединение за пользовательская сессия.
Один подход: полномочия
- Запрос пользователя
- Проверьте учетные данные действительны на дб бэкэндом
- хранения учетных данных в сеансового уровня переменных
Проблема с этим подходом является, по каждому последующему запросу для этой сессии; вам нужно будет создать новое соединение; и это быстро исчерпает максимальные соединения с сервером.
Я использую Flask с Oracle.
В Flask находится объект g
, в котором хранятся объекты с областью запроса. Этот фрагмент кода, хотя, не работает:
app = Flask(__name__)
app.config.from_object(__name__)
def login_required(f):
@wraps(f)
def decorated_function(*args, **kwargs):
if g.db is None:
return redirect(url_for('login', next=request.url))
return f(*args, **kwargs)
return decorated_function
class LoginForm(Form):
username = TextField('Username', [validators.Length(min=4, max=25)])
password = PasswordField('Password', [validators.Required()])
@app.route('/app', methods=['GET','POST'])
@login_required
def index():
return 'Index'
@app.route('/', methods=['GET','POST'])
def login():
form = LoginForm(request.form)
if request.method == 'POST':
if form.validate():
try:
dsn = cx_Oracle.makedsn(app.config['DB_HOST'],
app.config['DB_PORT'], app.config['DB_SID'])
g.db = cx_Oracle.connect(form.username.data,
form.password.data, dsn)
except cx_Oracle.DatabaseError as e:
flash(unicode(e), 'error')
return render_template('login.html', form=form)
return redirect(url_for('index'))
else:
return render_template('login.html', form=form)
else:
return render_template('login.html', form=form)
AttributeError: '_RequestGlobals' object has no attribute 'db'
cx_Oracle обеспечивает объединение пулов, однако, чтобы инициировать пул, мне нужны учетные данные пользователя. Итак, как только я получаю пул, как я могу запросить подключения из этого пула в течение всего запроса? –