如何让Flask记住登录会话

Toa*_*ast 3 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()
Run Code Online (Sandbox Code Playgroud)

dav*_*ism 14

如果您阅读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
Run Code Online (Sandbox Code Playgroud)

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


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

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

开发服务器(app.run())仅仅是为了当地的发展.如果要部署在生产,使用真正的应用服务器,比如uWSGIGunicorn,和一个真正的Web服务器,如Nginx的Apache的.它们比开发服务器提供了无限的性能和安全性.

暴露API并不坏,但直接暴露登录是不好的.您设置它的方式,远程站点必须收集并发送凭据.考虑设置OAuth提供程序,以便只有您的站点处理凭据.该协议栈交易所API提供了这个工作流程的一个很好的例子,而且有各种瓶的扩展,如烧瓶OAuthlib,实现这一点.

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