我正在制作基于文本的浏览器游戏,但我的登录脚本存在问题。 我登录时没有任何反应,甚至没有重定向。
这是我的代码:
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)
我现在正在寻找几个小时的解决方案,我已经阅读了烧瓶登录的整个文档,但我无法弄明白。
请帮帮我。
编辑:我删除了旧代码并添加了新代码,但它仍无效。
答案 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
类,该类提供用户方法和属性的默认实现。