Flask вне контекста приложения после тривиального изменения - PullRequest
1 голос
/ 13 февраля 2020

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

Код пытается получить новую переменную конфигурации из current_app.config. Когда он работал, он уже получал такие переменные.

Это работает, обратите внимание, что, следовательно, current_app.config['SECRET_KEY'] работает.

**config.py**
...
class Config(object):
    ...
    SECRET_KEY = os.getenv('SECRET_KEY') or \
        'yaP5vdVON2IlssoL3OZEo41P2MXJo6hx'
    ...

**models.py**
...
from flask import current_app
...

class User(UserMixin, db.Model):
    __bind_key__ = 'app'
    __tablename__ = 'user'
    )
    tennant_id = db.Column(db.ForeignKey('_constants.tennant_id'), nullable=False, index=True)
    user_id = db.Column(db.Integer, primary_key=True)
    identity_id = db.Column(db.Integer, index=True)
    ...
    def get_reset_password_token(self, expires_in=600):
        return jwt.encode(
            {'reset_password': self.user_id, 'exp': time() + expires_in},
            current_app.config['SECRET_KEY'],
            algorithm='HS256').decode('utf-8')

Следующее не работает , обратите внимание, что нет очевидных различий в способах обработки переменных конфигурации RELATIONSHIP_FOLLOW_TYPE и MESSAGE_POST_TYPE.

Кроме того, я использовал явно объявленные версии этих переменных в коде, поэтому код работал!

**config.py**
...
class Config(object):
    ...
    SECRET_KEY = os.getenv('SECRET_KEY') or \
        'yaP5vdVON2IlssoL3OZEo41P2MXJo6hx'
    ...
    MESSAGE_POST_TYPE = 2
    RELATIONSHIP_FOLLOW_TYPE = 1
    ...

**models.py**
...
from flask import current_app
...

class User(UserMixin, db.Model):
    __bind_key__ = 'app'
    __tablename__ = 'user'
    )
    tennant_id = db.Column(db.ForeignKey('_constants.tennant_id'), nullable=False, index=True)
    user_id = db.Column(db.Integer, primary_key=True)
    identity_id = db.Column(db.Integer, index=True)
    ...
    def get_reset_password_token(self, expires_in=600):
        return jwt.encode(
            {'reset_password': self.user_id, 'exp': time() + expires_in},
            current_app.config['SECRET_KEY'],
            algorithm='HS256').decode('utf-8')
    ...       
    def followed_posts(self):
        followed = Message.query.join(
            Relationship, 
            (Relationship.related_user_id == Message.sender_id)). \
            filter(Relationship.user_id == self.user_id). \
            filter(Relationship.relationship_type_id == current_app.config['RELATIONSHIP_FOLLOW_TYPE']). \
            filter(Message.message_type_id == current_app.config['MESSAGE_POST_TYPE'])
        own = Message.query.filter_by(
            sender_id = self.user_id,
            message_type_id = current_app.config['MESSAGE_POST_TYPE'])
        return followed.union(own).order_by(Message.timestamp.desc())

Я перепробовал все! В частности: -

  1. Я вернулся к более старой рабочей версии кода, вручную добавил переменную конфигурации в Config, вручную добавил использование этой переменной для чтения из конфигурации в models.py, и это сработало! Я не вижу различий между кодом!
  2. В моем новом нерабочем коде я вернул две новые переменные конфигурации обратно к явному объявлению, код работал до тех пор, пока не достигла следующей current_app.config переменной после SECRET_KEY, другими словами current_app.config работает для SECRET_KEY, но не для RELATIONSHIP_FOLLOW_TYPE и MESSAGE_POST_TYPE.

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

1 Ответ

0 голосов
/ 13 февраля 2020

Это не очень удовлетворительный ответ, но я объясню, что я сделал, если у кого-то есть лучший ответ, не стесняйтесь писать.

  1. Я создал новый класс в моем модуле config.py под названием Globals.
  2. Я переместил все новые переменные конфигурации из Config в Globals. После того, как этот Config вернулся к тому, как это было, когда приложение работало, а Globals - это новый класс.
  3. Я обновил весь свой код, чтобы получить новые переменные конфигурации из Globals и все исходные переменные из Config. Поэтому я добавил импорт для Globals и оставил импорт current_app в одиночку.
  4. Я изменил имена переменных, чтобы они указывали либо на глобальные переменные конфигурации, либо на переменные конфигурации соответственно.
  5. Я не двигался любой код или сделать любые другие изменения.

Хотя это не должно было сработать, это сработало.

Для дальнейшего тестирования я добавил несколько фиктивных переменных конфигурации в классе Config, и теперь они работают! Короче говоря, я не знаю, что было не так, но обошел это таким образом.

В заднем плане различие между true переменными конфигурации и параметрами приложения, вероятно, не плохая идея, поэтому Класс Config и Globals может быть хорошей идеей в любом случае.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...