如何让Flask记住登录会话

时间:2014-11-24 17:33:15

标签: python session flask flask-login

我正在使用Flask-Login创建一个烧瓶服务器,如下所示:

登录工作(打印正确的用户)。在此之后,我提出了测试请求。 它总是返回一个匿名用户,每次都返回一个不同的用户(希望看到刚刚登录的用户)。

请求是由同一(本地)ip上的http服务器上的html页面发出的,但是与烧瓶服务器不同。

这是我的python文件,使用crossdomainflask

from flask import *
from flask.ext.login import (LoginManager, UserMixin, login_user, current_user)
from crossdomainflask import *

class User(UserMixin):
    def __init__(self, username):
        self.name = username

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

class FlaskServer(object):
    def __init__(self):
        self.login_manager = LoginManager()
        self.server = Flask(__name__)
        self.server.secret_key = '123456'       
        self.server.config.update(PROPAGATE_EXCEPTIONS = True)
        self.login_manager.init_app(self.server)

        @self.login_manager.user_loader
        def load_user(userid):
            return User("test")

        @self.server.route('/api/login', methods=['POST'])
        @crossdomain(origin='*')
        def login():
            user = load_user(request.values.get('username'))
            if user:
                login_user(user)
                print(current_user)
                print(current_user.name)
                return 'ok'

        @self.server.route("/api/test", methods=['POST', 'GET'])        
        @crossdomain(origin='*')
        def test():
            print(current_user)
            return 'ok'

        self.server.run("0.0.0.0")
server = FlaskServer()

2 个答案:

答案 0 :(得分:13)

如果你read the docs for Flask-Login,你会发现你需要定义一个用户加载器,用户在登录后的后续请求中重新加载用户。

@login_manager.user_loader
def user_loader(id):
    # do whatever you need to to load the user object
    # a database query, for example
    user = MyUser.query.get(id)
    return user

问题也可能是,使用Flask-Login设置的登录cookie,跨域行为不正常。您可能需要更改cookie的域或其他安全功能以允许此操作。但是,这不是允许从其他站点登录的正确方法。


您发布的代码还有其他问题。

不需要服务器类,Flask中的所有模式都设计为在模块级别工作。所有状态都可以保存在应用及其配置中,并代理current_app

开发服务器(app.run())仅用于本地开发。如果要在生产中部署,请使用真实的应用程序服务器(如uWSGIGunicorn)和真实的Web服务器(如NginxApache)。它们比开发服务器提供了无限的性能和安全性。

公开API并不坏,但直接公开登录是不好的。您设置它的方式,远程站点必须收集并发送凭据。考虑设置OAuth提供程序,以便只有您的站点处理凭据。 Stack Exchange API提供了此工作流程的一个很好的示例,并且有各种Flask扩展,例如Flask-OAuthlib,可以实现此功能。

你不应该使用MD5哈希密码,它已经十年来一直非常不安全。使用真正的哈希实现,如PBKDF2,BCrypt或SCrypt。 Passlib为这些算法提供了一个优秀的界面,以及随着时间的推移升级哈希的能力。

答案 1 :(得分:-2)

flask-login似乎不能与crossdomainflask一起使用。 通过使用相同的烧瓶服务器提供静态文件解决了这个问题。