2016-05-06 5 views
1

Я использую флажок-логин, чтобы убедиться, что пользователи вошли в систему, прежде чем смогут получить доступ к определенным страницам. Я использую @login_required в представлении, которое хочу защитить, но хотя я устанавливаю login_user(user), где я хочу установить пользователя, он не позволяет мне войти в мой защищенный маршрут (индекс). Я распечатываю значение моего user_login(user) и возвращает True. Что я делаю не так?Флажок login @login_required не работает

@app.route('/') 
@app.route('/index') 
@login_required 
def index(): 
    print("was in here", file=sys.stderr) 
    return render_template('index.html') 

Это маршрут, где я установил user_login(user)

@app.route('/authenticate') 
def authenticate(): 
    code = request.args.get('code') 
    state = request.args.get('state') 
    quiz_auth_response = quizlet_auth(code, state) 

    g.token = quiz_auth_response['token'] 

    response = json.loads(make_request(quiz_auth_response['user_name'])) 

    try: 
     user = models.User.get(models.User.username == response['username']) 
     login_user(user) 
    except models.DoesNotExist: 
     print("does not exist", file=sys.stderr) 
     user = models.User.create_user(response['username'], response['id']) 
     return redirect('/index') 
    else: 
     login_user(user) 
     print("log in user " + str(login_user(user)), file=sys.stderr) 
     login_user(user) 
     return redirect('/index') 

Вот мой user_loader

@login_manager.user_loader 
def load_user(userid): 
    try: 
     return models.User.get(models.User.id == userid) 
    except models.DoesNotExist: 
     return None 

Вот моя модель пользователя

sqlite_db = SqliteDatabase('sqlite.db') 

class BaseModel(Model): 
    class Meta: 
     database = sqlite_db 

class User(UserMixin, BaseModel): 
    username = CharField(unique=True) 
    quizlet_id = CharField(unique=True) 
    joined_at = DateTimeField(default=datetime.datetime.now) 

    @classmethod 
    def create_user(cls, username, quiz_id, **kwards): 

     try: 
      cls.select().where(
       (cls.username == username) | (cls.quizlet_id == quiz_id) 
      ).get() 
     except cls.DoesNotExist: 
       print("putting user in thing", file=sys.stderr) 
       user = cls(username = username, quizlet_id = quiz_id) 

       print(user.username) 
       user.save() 
       return user 
     else: 
      raise Exception("User with that email exists already") 

    @staticmethod 
    def set_password(password): 

     return generate_password_hash(password.encode('utf-8')) 
+1

Где определяется ваш обратный вызов 'user_loader'? –

+0

@MattHealy в том же файле, что и мои маршруты. Я добавил его выше – Rafa

+0

, если вы запустили приложение в режиме отладки, какую ошибку вы получаете? – lesingerouge

ответ

1

Просто провел последние 2 часа, пытаясь исправить это, и понял, что это произошло потому, что от конфигурации, что login_required не работал

На моей локальной среде разработки, я установил

app.config['TESTING'] = True

от flask-login documentation

Если мошенник приложение фигурации переменная LOGIN_DISABLED или ТЕСТИРОВАНИЕ является набор в Правда, login_required декоратор будет игнорироваться

установить его в этом и получил это работает

app.config['TESTING'] = False

0

ли имя пользователя поле первичного ключа? Предполагая, что вы используете SQL алхимии, метод Get() Визитки искать для первичного ключа и не принимает выражений см http://docs.sqlalchemy.org/en/rel_1_0/orm/query.html#sqlalchemy.orm.query.Query.get

Попробуйте снова user = models.User.filter_by(username=response['username']) ...

+0

Я использую sqlite3, я пошел вперед и добавил моего пользователя. Модель – Rafa

+0

(не могу редактировать мой последний комментарий ¬¬). Я внедрил ваш код с использованием pewee ORM и проблемы, которые я был поскольку try-excep-else подавлял исключение на 'login_user()', это указывало на проблему с необходимыми методами в ORM для входа в фляж. Где идет пользовательский микс? Вы можете увидеть мой код [здесь] (https://gist.github.com/xfilipe/75c99c68e1c630449388140f2e804b9f), надеюсь, он вам поможет ... –

-1

Если вы используете склянки-логин, вам нужно убедиться, что у вас есть функция, которая может использоваться библиотекой для загрузки пользователя на основе идентификатора. Что-то типа:

@login_manager.user_loader 
def load_user(user_id): 
    return models.User.get(models.User.id == user_id) 

Пожалуйста, прочтите this section из документации для того, как это сделать.

+0

У меня есть загрузчик. Я не считаю, что это проблема – Rafa

 Смежные вопросы

  • Нет связанных вопросов^_^