首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Flask-login不能登录

Flask-login不能登录
EN

Stack Overflow用户
提问于 2017-03-27 03:26:09
回答 2查看 3.9K关注 0票数 1

我正在制作一个基于文本的浏览器游戏,但我的登录脚本有问题。当我登录的时候什么也没有发生,它甚至没有重定向。

下面是我的代码:

代码语言:javascript
复制
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)

下面是我的user类:

代码语言:javascript
复制
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)

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

请帮帮我。

编辑:我删除了旧代码并添加了新代码,但它仍然不起作用。

EN

回答 2

Stack Overflow用户

发布于 2017-04-03 18:19:56

我会给你我的工作登录代码,其中使用Flask-login和Flask-WTF。

查看功能:

代码语言:javascript
复制
@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)

登录表单:

代码语言:javascript
复制
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')

用户模型:

代码语言:javascript
复制
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
EN

Stack Overflow用户

发布于 2017-03-27 15:34:13

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43033461

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档