Ответ 1
flask.g
будет хранить вещи только на время запроса. В документации упоминалось, что значения хранятся в контексте приложения, а не в запросе, но это скорее проблема реализации: она не изменяет тот факт, что объекты в flask.g
доступны только в одном потоке, а во время время жизни одного запроса.
Например, в разделе официального раздела по подключению к базе данных соединение выполняется один раз в начале запроса, а затем завершается в конце запроса.
Конечно, если вы действительно этого хотели, вы могли бы создать соединение с базой данных один раз, сохранить его в __init__.py
и ссылаться на него (как глобальную переменную) по мере необходимости. Однако вы не должны этого делать: соединение может закрыть или тайм-аут, и вы не сможете использовать соединение в нескольких потоках.
Поскольку вы не указали, КАК вы будете использовать Mongo в Python, я предполагаю, что вы будете использовать PyMongo, поскольку это обрабатывает все пул соединений для вас.
В этом случае вы бы сделали что-то вроде этого...
from flask import Flask
from pymongo import MongoClient
# This line of code does NOT create a connection
client = MongoClient()
app = Flask()
# This can be in __init__.py, or some other file that has imported the "client" attribute
@app.route('/'):
def index():
posts = client.database.posts.find()
Вы могли бы, если хотите, сделать что-то вроде этого...
from flask import Flask, g
from pymongo import MongoClient
# This line of code does NOT create a connection
client = MongoClient()
app = Flask()
@app.before_request
def before_request():
g.db = client.database
@app.route('/'):
def index():
posts = g.db.posts.find()
Это не совсем так, но может быть полезно для логики, которую вы хотите выполнять по каждому запросу (например, установка g.db
в определенную базу данных в зависимости от пользователя, который вошел в систему).
Наконец, вы можете понять, что большая часть работы по настройке PyMongo с Flask, вероятно, сделана для вас в Flask-PyMongo.
Ваш другой вопрос касается того, как вы отслеживаете материал, характерный для пользователя, который зарегистрировался. Ну, в этом случае вам нужно хранить некоторые данные, которые связаны с соединением. flask.g
очищается в конце reququest, так что ничего хорошего.
То, что вы хотите использовать, sessions. Это место, где вы можете хранить значения, которые (с реализацией по умолчанию) хранятся в файле cookie в браузере пользователя. Поскольку cookie будет передаваться вместе с каждым запросом, который пользовательский браузер делает на вашем веб-сайте, у вас будут доступны данные, которые вы ввели в сеанс.
Имейте в виду, что сеанс НЕ хранится на сервере. Он превращается в строку, которая передается пользователю обратно. Поэтому вы не можете хранить на нем такие вещи, как соединения с DB. Вместо этого вы будете хранить идентификаторы (например, идентификаторы пользователей).
Убедившись, что аутентификация пользователя работает, ОЧЕНЬ трудно получить право. Проблемы безопасности, которые необходимо соблюдать, являются удивительно сложными. Я бы настоятельно рекомендовал использовать что-то вроде Flask-Login, чтобы обработать это для вас. Вы по-прежнему можете использовать session
для хранения других элементов по мере необходимости, или вы можете позволить дескриптору Flask-Login определять идентификатор пользователя и сохранять значения, которые вам нужны в базе данных, и извлекать их из базы данных в каждом запросе.
Итак, в целом, есть несколько разных способов сделать то, что вы хотите сделать. У каждого есть свои обычаи.
- Глобалы хороши для элементов, которые являются потокобезопасными (например, PyMongo MongoClient).
-
flask.g
может использоваться для хранения данных в течение срока службы запроса. При использовании фляжных приложений на основе SQLAlchemy, общая задача - обеспечить, чтобы все изменения происходили сразу, в конце запроса, используя методafter_request
. Использованиеflask.g
для чего-то подобного очень полезно. - Флажок
session
может использоваться для хранения простых данных (строк и номеров, а не объектов соединения), которые могут использоваться для последующих запросов, поступающих от одного и того же пользователя. Это полностью зависит от использования файлов cookie, поэтому в любой момент пользователь может удалить файл cookie, и все в "сеансе" будет потеряно. Поэтому вы, вероятно, захотите хранить большую часть своих данных в базах данных, а сеанс используется для идентификации данных, относящихся к пользователю в сеансе.