Flask-login无法登录

时间:2017-03-26 19:26:09

标签: python flask flask-login

我正在制作基于文本的浏览器游戏,但我的登录脚本存在问题。 我登录时没有任何反应,甚至没有重定向。

这是我的代码:

from flask import Flask,render_template,redirect,request,url_for,session
from flask_login import LoginManager, current_user, login_user, login_required
# this contains the configuration and the database connection
from config import users, stats, register_user
from werkzeug.security import check_password_hash
# load the user model
from user import User


version = 2.00
app = Flask(__name__)
login_manager = LoginManager()
login_manager.init_app(app)
login_manager.login_view = 'login'
app.config['SECRET_KEY'] = "lkajdghdadkglajkgah"

#the user loader callback
@login_manager.user_loader
def load_user(user_id):
    u = users.find_one({"_id": user_id})
    if not u:
        return None
    return User(u['_id'])

@app.route('/')
def main():
    if current_user.is_authenticated:
        return redirect("/game/", code=302)
    else:
        return redirect("/login/", code=302)

@app.route('/login/', methods=['GET','POST'])
def login():
    if current_user.is_authenticated:
        return redirect("/game/", code=302)

    # when the form is filled in
    if request.method == 'POST':
        try:
            # login user
            if request.form['logSubmit'] == 'logSubmit':
                username = request.form['logUser']
                password = request.form['logPassword']
                result = users.find_one({"user": username})

                if result and check_password_hash(result['password_hash'], password):
                    resid = result['_id']
                    print(resid)
                    user_obj = User(resid)
                    login_user(user_obj)
                    return redirect(request.args.get("next") or url_for("game"))

        except KeyError:
            # register the user
            if request.form['regSubmit'] == 'regSubmit':
                username = request.form['regUser']
                password = request.form['regPassword']
                address = request.form['regAddress']
                register_user(username=username,password=password,address=address)
                print(address)
                return redirect("/login/", code=302)

    return render_template('out.html')

@app.route('/game/')
@login_required
def game():
    return render_template('game.html')

@app.route('/logout')
def logout():
    logout_user()
    return redirect("/login/", code=302)

这是我的用户类:

class User():

    def __init__(self,id):
        self.id = id
        self.email = None
        print (str(id)+" has logged in.")

    #def getStats(self):
        #get the statistics of the user from the database
        #return "your getStats() is still under construction"
    @property
    def is_authenticated(self):
        return True

    @property
    def is_active(self):
        return True

    @property
    def is_anonymous(self):
        return False

    def get_id(self):
        return str(self.id)

我现在正在寻找几个小时的解决方案,我已经阅读了烧瓶登录的整个文档,但我无法弄明白。

请帮帮我。

编辑:我删除了旧代码并添加了新代码,但它仍无效。

2 个答案:

答案 0 :(得分:1)

我将为您提供我的工作登录代码,该代码使用Flask-login和Flask-WTF。

查看功能:

@app.route("/login", methods=["GET","POST"])
def login():
    form = LoginForm()
    if form.validate_on_submit():
        user = User.get_by_username(form.username.data)
        if user is not None:
            login_user(user, form.remember_me.data)
            flash("logged in successfully as {}".format(user.username))
            return redirect(request.args.get('next') or url_for('index'))
        flash("Incorrect username or password")
    return render_template("login.html", form=form)

登录表格:

from flask_wtf import FlaskForm 
from wtforms.fields import StringField, PasswordField, BooleanField,           SubmitField
from wtforms.validators import DataRequired, url, Length, Email, Regexp,     EqualTo, ValidationError

from models import User    
class LoginForm(FlaskForm):
    username = StringField('Your Username: ', validators=[DataRequired()])
    password = PasswordField('password', validators=[DataRequired()])
    remember_me = BooleanField("Keep me logged in")
    submit = SubmitField('Log In')

用户模型:

class User(db.Model, UserMixin):
    id = db.Column(db.Integer, primary_key=True)
    username = db.Column(db.String(80), unique=True)
    email = db.Column(db.String(120), unique=True)
    password_hash = db.Column(db.String(80))

您可以在自己的代码中实现该代码,看看它是否能解决您的问题

答案 1 :(得分:0)

实现登录的一种更简单的方法是使用Flask-WTF来处理大部分表单处理。此外,在您的User模型中,继承自Flask-Login的UserMixin类,该类提供用户方法和属性的默认实现。

相关问题