Как сохранить значение как глобальную переменную, специфичную для пользователя? - PullRequest
0 голосов
/ 18 октября 2018

В настоящее время я работаю над небольшим приложением для колб, которое будет подключаться к API и обрабатывать данные, извлеченные из этого API.

Пользователи могут войти в мое приложение для колб, а затем определить свои учетные данные для взаимодействияс API.У любого данного пользователя может быть один или несколько учетных данных API, связанных с его пользователем.

Я создал модели БД для хранения учетных данных пользователя и Api в базе данных следующим образом.

Я использую модуль flask-login, в котором есть объект " current_user ", который предоставляет мне модель пользователя, которая в данный момент вошла во все мое приложение.

Модели:

class User(UserMixin, db.Model):
    __tablename__ = 'users'
    id = db.Column(db.Integer, primary_key=True)
    username = db.Column(db.String(64), index=True, unique=True)
    email = db.Column(db.String(128), index=True, unique=True)
    firstname = db.Column(db.String(55))
    lastname = db.Column(db.String(55))
    password = db.Column(db.String(128))
    creds = db.relationship('ApiCredential', backref='owner', lazy='dynamic')

class ApiCredential(db.Model):
    __tablename__ = 'api_credentials'
    id = db.Column(db.Integer, primary_key=True)
    site = db.Column(db.String(140))
    user = db.Column(db.String(140))
    username = db.Column(db.String(100), index=True, unique=True)
    password = db.Column(db.String(55))
    base = db.Column(db.String(100))
    owner_id = db.Column(db.Integer, db.ForeignKey('users.id'))
    active = db.Column(db.Boolean)

Я хотел бы знать, как создать аналогичную "глобальную переменную" для моих учетных данных API, которая относится только к зарегистрированному пользователю, а не ко всем пользователям приложения.

ПРИМЕЧАНИЕ *** Похоже, что current_user - это нечто, называемое локальным прокси, с которым я совсем не знаком и не могу найти какой-либо достойной документации или объяснения, что это такое и как его использовать.для моих нужд.

Ответы [ 2 ]

0 голосов
/ 19 октября 2018

Вас ждет увлекательная поездка, в конце которой вы можете сделать что-то менее волшебное.

Во-первых, это помогает понять, как работает current_user.Источник (на данный момент) здесь .Это werkzeug.local.LocalProxy, который оборачивает лямбду, которая вызывает flask_login.utils._get_user.

LocalProxy - это довольно круто, и понимание того, что это отличный способ повысить уровень в Python, но при входе в флеш-систему используется тонкийчасть этого.Источник (на данный момент) здесь .Это выглядит страшно, но если вы отслеживаете код, он просто вызывает локальный аргумент (лямбда-логин от flask-login).

Это возвращает нас к _get_user ( здесь , какэтого момента), который загружает пользователя, если его нет (в верхней части текущего контекста запроса), а затем возвращает пользователя из верхней части контекста запроса.

Вы можете следовать этому шаблонуи напишите пакет, который экспортирует current_credentials.Вы будете следовать той же схеме, используя werkzeug.local.LocalProxy, чтобы обернуть лямбду, которая вызывает, скажем, _get_credentials.Хитрость заключается в том, чтобы импортировать current_user из flask-login, используя его с _get_credentials, чтобы получить пользователя, с помощью которого можно построить запрос для присоединения к вашей таблице ApiCredentials.

Или вы можете взятьпростой подход и напишите вспомогательный метод для ваших представлений, который будет использовать current_user, чтобы получить пользователя, а затем выполнить объединение, чтобы получить учетные данные API для этого пользователя.

0 голосов
/ 18 октября 2018

Одним из способов может быть создание нового маршрута в приложении фляги, когда пользователь get запрашивает страницу, тогда вы можете проверить, кто он, когда вы знаете, какой это пользователь, вы можете запросить, используя свои учетные данные API.модель и фильтр по current_user.id.

creds = ApiCredentials.query.filter_by(owner_id=current_user.id).first_or_404()

Затем вы можете делать все, что пожелаете, с информацией, хранящейся в вашей таблице учетных данных API.

Я не понимаю, почему вы захотите копировать функциональность загрузчика пользователей.Эта функция будет включена в какой-то момент при настройке входа в Flask.Очень короткая функция, которая возвращает текущий пользовательский объект из пользовательской модели.

Вы можете отобразить или вернуть ваши ключи API.Отобразите их на странице в виде HTML или для более автономных заданий, вы можете использовать jsonify, чтобы вернуть ключи в виде строки json.

Извините, это не дает прямого ответа на ваш вопрос, но я надеюсь, что мое предложениеможет привести вас к несколько менее сложному ответу, и вы сможете продолжить разработку своего веб-приложения.Возможно, стоило бы вернуться к этому позже.

Примечание: это не в моей голове.Возможно, потребуется ввести следующую строку кода:

creds = ApiCredentials.query.filter_by(owner_id==current_user.id).first()

Кроме того, вы можете не захотеть использовать .first(), если в таблице хранится несколько учетных данных API.

В этом случае это будет более подходящим:

creds = ApiCredentials.query.filter_by(owner_id==current_user.id).all()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...