2016-02-26 8 views
2

Имеет ли Flask встроенную поддержку функций входа/выхода пользователя? Я нашел this add-on project, но кажется, что это дает части для создания собственной системы входа. Кажется, это не полная система.Реализация страницы входа с Flask

Я новичок в Flask, и я прихожу из Django, где все это встроено, поэтому я немного озадачиваюсь тем, что эта базовая функциональность отсутствует.

Используя некоторые неполные примеры, которые я нашел, я пытаюсь реализовать страницу индекса, перенаправляющую на страницу входа для анонимных пользователей, и после успешного входа в систему перенаправляет страницу на индексную страницу. Это то, что я в настоящее время внедрили как «привет мир», например Логин/выхода из системы:

#!/usr/bin/env python 

import flask 
from flask import Flask, Response, render_template 
from flask.ext.login import LoginManager, UserMixin, login_required, login_user, logout_user 


app = Flask(__name__) 
login_manager = LoginManager() 
login_manager.init_app(app) 


class User(UserMixin): 
    # proxy for a database of users 
    user_database = { 
     "JohnDoe": ("JohnDoe", "John"), 
     "JaneDoe": ("JaneDoe", "Jane"), 
    } 

    def __init__(self, username, password): 
     self.id = username 
     self.password = password 

    @property 
    def name(self): 
     return self.id 

    @classmethod 
    def get(cls, id): 
     ret = cls.user_database.get(id) 
     if ret is not None: 
      return cls(*ret) 

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

@login_manager.request_loader 
def load_user(request): 
    token = request.headers.get('Authorization') 
    if token is None: 
     token = request.args.get('token') 

    if token is not None: 
     username,password = token.split(":") # naive token 
     user_entry = User.get(username) 
     if (user_entry is not None): 
      user = User(user_entry[0],user_entry[1]) 
      if (user.password == password): 
       return user 
    return None 


@app.route("/",methods=["GET"]) 
@login_manager.request_loader 
def index(): 
    if load_user(flask.request): 
     return render_template('index.html') 
    else: 
     return flask.redirect(flask.url_for('login')) 
    #return Response(response="Hello World!",status=200) 

@app.route('/login', methods=['GET', 'POST']) 
def login(): 
    if flask.request.method == 'GET': 
     return ''' 
       <form action='login' method='POST'> 
       <input type='text' name='email' id='email' placeholder='email'></input> 
       <input type='password' name='pw' id='pw' placeholder='password'></input> 
       <input type='submit' name='submit'></input> 
       </form> 
       ''' 

    email = flask.request.form['email'] 
    user = User.get(email) 
    if user and flask.request.form['pw'] == user.password: 
     login_user(user) 
     return flask.redirect(flask.url_for('index')) 

    return 'Bad login' 

@app.route("/logout") 
@login_required 
def logout(): 
    logout_user() 
    return flask.redirect(flask.url_for('index')) 

if __name__ == '__main__': 
    app.config["SECRET_KEY"] = "ITSASECRET" 
    app.run(port=5000, debug=True) 

Однако, это не работает, потому что несмотря на то, что, кажется, успешно войти в систему, когда он перенаправляет на страницу индекса, он не может искать пользователя из сеанса и перенаправляет обратно на страницу входа в систему. Что я делаю не так?

+0

Вам необходимо прочитать документацию для флажка-входа ... в вашем классе пользователя отсутствуют некоторые необходимые вещи (например, isAnonomous) –

+0

Я не уверен, почему вы смущены тем, что auth не входит в Flask. [На веб-сайте] (http://flask.pocoo.org/) четко сказано: «Флакон - это микрокарандаш». Это не значит, что вы сильно запекли. См. Также http://flask.pocoo.org/docs/0.10/foreword/#what-does-micro-mean: «Многочисленные расширения обеспечивают интеграцию базы данных, проверку формы, обработку загрузки, различные технологии открытой аутентификации и многое другое ». – Chris

ответ

2

Flask-Login - это очень простой менеджер входа в систему, основанный на нескольких других структурах управления пользователями. Я использую Flask-User в производстве более 1,5 лет с примерно 30 тыс. Пользователей и не имел с ним никаких проблем (в котором используется колба-вход под капотом). Сопровождающий активен и своевременно ответил на мои вопросы.

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

+0

Какова стабильность ванильного флакона-входа по сравнению с Flask-User? – franklin

+0

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

0

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

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

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