2017-03-26 209 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)) 

您可以實現代碼在你自己,看看它是否解決了你的問題