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