使用Flask实现登录页面

时间:2016-02-26 23:03:29

标签: python login flask flask-login

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

我是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)

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

2 个答案:

答案 0 :(得分:2)

Flask-Login是一个非常基本的登录管理器,它基于一些其他用户管理框架。我一直在使用Flask-User生产超过1。5年,用户约30,000,并且没有任何问题(使用烧瓶登录)。维护者是活跃的,并及时回应了我的问题。

如果需要,它会处理用户登录,注册,丢失密码甚至电子邮件确认。它带有一些预先构建的表单,如果你不想搞砸,但如果你这样做很容易定制。

答案 1 :(得分:0)

听起来可能在dput(dateyear) structure(c(8735, 9100, 9465, 9831, 10196, 10561, 10926, 11292, 11657, 12022, 12387, 12753, 13118, 13483, 13848, 14214, 14579, 14944, 15309, 15675, 16040, 16405), class = "Date") dput(revenue) c(97825, 99683, 107893, 116728, 120279, 100697, 160883, 232748, 213488, 204506, 246738, 298035, 370680, 377635, 404552, 477359, 310586, 383221, 486429, 482295, 438255, 411939) 被调用时,登录没有被持久化。我会确保你正在进行的会话实际上是存储登录。