2016-10-27 28 views
0

Flask-PythonアプリケーションにFlask-Loginを追加しようとしていますが、このエラーが発生しています。 私はuser.loaderが正しいとは思っていませんが、アイデアはIDまたは電子メールに基づいてユーザーを読み込むことです。DataError:(psycopg2.DataError)整数の入力構文が無効です

私は間違って何を考えていますか?事前

よろしくで

おかげ

フルエラー:

DataError: (psycopg2.DataError) invalid input syntax for integer: "[email protected]" LINE 3: WHERE users.uid = '[email protected]'

app.py

from flask import Flask, render_template, request, session, redirect, url_for 
from models import db, User 
from forms import SignupForm, LoginForm 
from flask_login import LoginManager, UserMixin, \ 
           login_required, login_user, logout_user 

app = Flask(__name__) 

app.config['SQLALCHEMY_DATABASE_URI'] = 'postgresql://localhost/polex' 
db.init_app(app) 

login_manager = LoginManager() 
login_manager.init_app(app) 
login_manager.login_view = "login" 

app.secret_key = "development-key" 


@login_manager.user_loader 
def user_loader(uid): 
    """Given *user_id*, return the associated User object. 

    :param unicode user_id: user_id (email) user to retrieve 
    """ 
    return User.query.get(uid) 


@app.route("/") 
def index(): 
    return render_template("index.html") 

@app.route("/about") 
def about(): 
    return render_template("about.html") 

@app.route("/signup", methods=["GET", "POST"]) 
def signup(): 
    if 'email' in session: 
    return redirect(url_for('home')) 

    form = SignupForm() 

    if request.method == "POST": 
    if form.validate() == False: 
     return render_template('signup.html', form=form) 
    else: 
     newuser = User(form.first_name.data, form.last_name.data, form.email.data, form.password.data) 
     db.session.add(newuser) 
     db.session.commit() 

     session['email'] = newuser.email 
     return redirect(url_for('home')) 

    elif request.method == "GET": 
    return render_template('signup.html', form=form) 

@app.route("/login", methods=["GET", "POST"]) 
def login(): 
    print db 

    form = LoginForm() 

    if request.method == "POST": 
    if form.validate() == False: 
     return render_template("login.html", form=form) 
    else: 
     email = form.email.data 
     password = form.password.data 

     user = User.query.filter_by(email=email).first() 
     if user is not None and user.check_password(password): 
     login_user(user, remember=True) 
     return redirect(url_for('home')) 
     else: 
     return redirect(url_for('login')) 

    elif request.method == 'GET': 
    return render_template('login.html', form=form) 

@app.route("/logout") 
def logout(): 
    session.pop('email', None) 
    return redirect(url_for('index')) 

@app.route("/home", methods=["GET", "POST"]) 

def home(): 


    return render_template("home.html") 

if __name__ == "__main__": 
    app.run(debug=True) 

models.pyWERKZEUG輸入generate_password_hashからflask_sqlalchemy輸入SQLAlchemyの から0、輸入UserMixin

db = SQLAlchemy() 

class User(db.Model): 
    __tablename__ = 'users' 
    uid = db.Column(db.Integer, primary_key = True) 
    firstname = db.Column(db.String(100)) 
    lastname = db.Column(db.String(100)) 
    email = db.Column(db.String(120), unique=True) 
    pwdhash = db.Column(db.String(54)) 

    #-----login requirements----- 
    def is_active(self): 
    #all users are active 
    return True 

    def get_id(self): 
     # returns the user e-mail. not sure who calls this 
    return self.email 

    def is_authenticated(self): 
    return self.authenticated 

    def is_anonymous(self): 
     # False as we do not support annonymity 
    return False 

    def __init__(self, firstname, lastname, email, password): 
    self.firstname = firstname.title() 
    self.lastname = lastname.title() 
    self.email = email.lower() 
    self.set_password(password) 

    def set_password(self, password): 
    self.pwdhash = generate_password_hash(password) 

    def check_password(self, password): 
    return check_password_hash(self.pwdhash, password) 

答えて

0

をflask_loginからcheck_password_hash あなたはfilterfilter_byを使用する必要がUser.query.get(uid)を使用している:

@login_manager.user_loader 
def user_loader(user_email): 
    """Given *user_id*, return the associated User object. 

    :param unicode user_id: user_id (email) user to retrieve 
    """ 
    return User.query.filter_by(email=user_email).first() 

get()は、主キーをとります(この場合はユーザーIDになります)、それを返します。フィルターは、列の値を制限しようとしている場合に必要なものです。

+0

ご意見ありがとうございます。私はそれを試みたが、 'TypeError:この句のブール値は定義されていない ' – Perseverance

+0

@perseveranceは' filter_by'を使って上記の修正を試みるように気をつけていますか? – rofls

+0

まあ、実際には、エラーを 'AttributeError:' BaseQuery 'に変更しました。' is_authenticated '属性はありません。そのuser_emailは正しいですか?私は自分のmodel.pyのUserを参照していないからです。どのようにしてそのような電子メールを解析するのですか? 申し訳ありませんが、ありがとうございます! – Perseverance

関連する問題