2017-03-26 5 views
0

Ich mache ein textbasiertes Browserspiel, aber ich habe ein Problem mit meinem Anmeldeskript. Nichts passiert, wenn ich mich anmelde, es wird nicht einmal umgeleitet.Flask-Login meldet sich nicht an

Hier ist mein Code:

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) 

und hier ist meine Benutzerklasse:

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) 

Ich bin für ein paar Stunden jetzt für die Lösung suchen, und ich habe eine der Lese ganze Dokumentation von flask-login, aber ich kann es nicht herausfinden.

Bitte helfen Sie mir.

EDIT: Ich entfernte den alten Code und fügte den neuen Code hinzu, aber es funktioniert immer noch nicht.

+1

In Ihrem 'Benutzer 'Klasse überschreiben Sie Ihre Eigenschaften mit Funktionen. Auf diese Weise gibt 'user.is_authenticated' ein Funktionsobjekt und nicht den gewünschten booleschen Wert zurück. In Python ist es üblich, Funktions-Getter/Setter zu überspringen, wenn es möglich ist. Löschen Sie einfach die Getterfunktionen und Sie sollten in Ordnung sein. – MrLeeh

+1

Auch Ihr 'Benutzer'-Objekt ist nirgendwo im Code definiert. Es könnte ein Tippfehler sein oder durch die Importe importiert werden. Ich kann es nicht klar sagen. Das ist der Grund, warum Sie Importe vermeiden sollten. – MrLeeh

+0

@MrLeeh Ich habe versucht, die Getter-Funktionen zu entfernen, aber es funktioniert immer noch nicht. Das Benutzerobjekt kommt tatsächlich von config. – ruttydm

Antwort

0

Eine einfachere Möglichkeit, Ihre Anmeldung zu implementieren, ist mit Flask-WTF, die meisten der Formularverarbeitung für Sie behandelt. Erben Sie in Ihrem Modell User stattdessen von der Klasse UserMixin von Flask-Login, die Standardimplementierungen der Benutzermethoden und -eigenschaften bereitstellt.

+0

Danke Achim. Hab vorher noch nichts davon gehört. Ich werde es mir ansehen. – ruttydm

+0

Sie sind herzlich willkommen hey zögern Sie nicht mich zu fragen, wenn Sie andere Probleme haben –

+0

Mein Problem ist immer noch nicht gelöst. – ruttydm

1

Ich werde Ihnen Code meines Arbeits-Logins geben, der Flask-Login und Flask-WTF nutzt.

The View Funktion:

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

Das Anmeldeformular:

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

Der Benutzer Modell:

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

Sie diesen Code in Ihren eigenen implementieren können und sehen, ob sie löst Ihr Problem

Verwandte Themen