2017-03-26 156 views
0

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

这里是我的代码:

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) 

我找了几个小时,现在的解决方案,我有一个读烧瓶登录的完整文档,但我无法弄清楚。

请帮帮我。

编辑:我删除了旧的代码,并添加了新的代码,但它仍然无法正常工作。

+1

在你的用户'你正在用函数覆盖你的属性。这样'user.is_authenticated'将返回一个函数对象,而不是所需的布尔值。在Python中,如果可能的话,通常会跳过函数getters/setters。所以只要删除getter函数,你应该没问题。 – MrLeeh

+1

您的'用户'对象在代码中的任何地方都没有定义。它可能是一个错字或由*进口导入。我不能说清楚。这就是为什么你应该避免*进口的原因。 – MrLeeh

+0

@MrLeeh我试图删除getter函数,但它仍然不起作用。用户对象的确来自config。 – ruttydm

回答

0

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

+0

谢谢Achim。之前没有听说过。我会仔细看看的。 – ruttydm

+0

欢迎您随时问我是否有其他问题 –

+0

我的问题仍然没有解决。 – ruttydm

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

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