Python 用Flask实现登录页面

Python 用Flask实现登录页面,python,login,flask,flask-login,Python,Login,Flask,Flask Login,Flask是否有任何内置的用户登录/注销功能支持?我发现了,但它似乎只提供了构建您自己的登录系统的部分。它似乎不是一个完整的系统 我是Flask的新手,我来自Django,这里的功能都是内置的,所以我发现缺少这个基本功能有点令人困惑 使用我发现的一些不完整的示例,我试图实现一个索引页面,该页面重定向到匿名用户的登录页面,并且在成功登录后,将页面重定向到索引页面。这是我目前实现的“hello world”登录/注销示例: #!/usr/bin/env python import flask fr

Flask是否有任何内置的用户登录/注销功能支持?我发现了,但它似乎只提供了构建您自己的登录系统的部分。它似乎不是一个完整的系统

我是Flask的新手,我来自Django,这里的功能都是内置的,所以我发现缺少这个基本功能有点令人困惑

使用我发现的一些不完整的示例,我试图实现一个索引页面,该页面重定向到匿名用户的登录页面,并且在成功登录后,将页面重定向到索引页面。这是我目前实现的“hello world”登录/注销示例:

#!/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)
#/usr/bin/env python
进口烧瓶
从烧瓶导入烧瓶,响应,呈现\u模板
从flask.ext.login导入LoginManager、UserMixin、login\u required、login\u user、logout\u user
app=烧瓶(名称)
login\u manager=LoginManager()
登录管理器。初始化应用程序(应用程序)
类用户(UserMixin):
#用户数据库的代理
用户\u数据库={
“约翰多”:(“约翰多”、“约翰”),
“JaneDoe”:(“JaneDoe”、“Jane”),
}
定义初始化(self、用户名、密码):
self.id=用户名
self.password=密码
@财产
def名称(自我):
返回self.id
@类方法
def get(cls,id):
ret=cls.user\u database.get(id)
如果ret不是无:
返回cls(*ret)
@登录\u manager.user\u加载程序
def加载用户(用户id):
返回User.get(用户\u id)
@登录\u管理器。请求\u加载程序
def加载_用户(请求):
token=request.headers.get('Authorization')
如果令牌为无:
token=request.args.get('token')
如果令牌不是无:
用户名,密码=token.split(“:”)#naive token
user\u entry=user.get(用户名)
如果(用户输入不是无):
user=user(user\u条目[0],user\u条目[1])
如果(user.password==密码):
返回用户
一无所获
@app.route(“/”,methods=[“GET”])
@登录\u管理器。请求\u加载程序
def index():
如果加载用户(烧瓶请求):
返回渲染模板('index.html')
其他:
返回flask.redirect(flask.url_for('login'))
#返回响应(Response=“Hello World!”,状态=200)
@app.route('/login',methods=['GET','POST'])
def login():
如果flask.request.method==“GET”:
返回“”'
'''
email=flask.request.form['email']
user=user.get(电子邮件)
如果用户和flask.request.form['pw']==用户密码:
登录用户(用户)
返回flask.redirect(flask.url_表示('index'))
返回“错误登录”
@应用程序路径(“/注销”)
@需要登录
def注销():
注销用户()
返回flask.redirect(flask.url_表示('index'))
如果uuuu name uuuuuu='\uuuuuuu main\uuuuuuu':
app.config[“密钥”]=“ITSASECRET”
运行(端口=5000,调试=True)

但是,它不起作用,因为即使它似乎成功登录,但当它重定向到索引页面时,它无法从会话中查找用户并重定向回登录页面。我做错了什么?

Flask Login是一个非常基本的登录管理器,它与其他一些用户管理框架一起构建。我已经在生产中使用了超过1.5年,有大约30000名用户,并且没有任何问题(在引擎盖下使用flask登录)。维护人员积极主动,并及时响应了我的问题


它可以处理用户登录、注册、丢失密码,如果需要,甚至可以处理电子邮件确认。如果你不想弄乱它,它附带了一些预构建的表单,但是如果你想弄乱它,它很容易定制。

听起来像是当
login\u user
被调用时,登录没有被持久化。我会确保您在进行会话时,实际上是在存储登录信息。

您需要阅读有关flask登录的文档。。。您的用户类缺少一些必需的东西(例如,isAnonomous),我不知道为什么您会对Flask中没有包含auth感到困惑。清楚地说“烧瓶是一个微框架”。它不应该有太多的烘烤。还可以看到:“许多扩展提供了数据库集成、表单验证、上传处理、各种开放验证技术等等。”与瓶子烧瓶用户相比,香草瓶登录的稳定性是什么?我的多个框架使用了FLASK登录,并且在我的经验中,稳定性似乎与烧瓶用户相当。