Получите TypeError "Неожиданный аргумент ключевого слова" на Query.Get - PullRequest
0 голосов
/ 01 ноября 2019

Я следую этому мега-учебнику Flask и столкнулся с проблемой. Я использую PyCharm CE для Windows.

Часть, в которой я сталкиваюсь с проблемой - после добавления регистрации пользователя. Форма для заявки. При запуске приложения и попытке регистрации нового пользователя в браузере я получаю следующую ошибку из проверки формы:

File "C:\Users\janmar\OneDrive - KONGSBERG MARITIME AS\Programming\Python\Projects\colligero\app\forms.py", line 49, in validate_username
user = User.query.get(username=username.data).first()
TypeError: get() got an unexpected keyword argument 'username'

, которая исходит из пользовательского метода проверки 'def validate_username' в модуле forms.py,Я думаю, что он не может "найти" элемент 'username' в классе User в модуле models.py?

from flask_wtf import FlaskForm
from wtforms import StringField, PasswordField, BooleanField, SubmitField
from wtforms.validators import DataRequired, ValidationError, Email, EqualTo, Regexp, Length
from app.models import User


class LoginForm(FlaskForm):

    username = StringField("Username", validators=[DataRequired()])
    password = PasswordField("Password", validators=[DataRequired()])
    remember_me = BooleanField("Remember Me")
    submit = SubmitField("Sign In")


class RegistrationForm(FlaskForm):

    first_name = StringField("First Name", validators=[
        Regexp(regex=r'^[a-zA-Z]+$', message="First name can not contain numbers or special characters.")])
    last_name = StringField("Last Name", validators=[
        Regexp(regex=r'^[a-zA-Z]+$', message="First name can not contain numbers or special characters.")])
    username = StringField("Username", validators=[
        Regexp(regex=r'^\w+$', message="Username can only contain letters, numbers or underscore."),
        Length(min=5, max=25, message="Username must be between 5 and 25 characters.")])
    email = StringField("Email", validators=[
        DataRequired(),
        Email()])
    password = PasswordField("Password", validators=[
        DataRequired()])
    confirm = PasswordField("Repeat Password", validators=[
        DataRequired(), EqualTo('password')])
    submit = SubmitField("Register")

    def validate_username(self, username):

        user = User.query.get(username=username.data).first()

        if user is not None:

            raise ValidationError("Username is already taken by another. Please select a different username.")

    def validate_email(self, email):

        user = User.query.get(email=email.data).first()

        if user is not None:

            raise ValidationError("Email is already taken by another user. Please select a different email.")

Это содержимое файла models.py.

from datetime import datetime
from werkzeug.security import generate_password_hash, check_password_hash
from flask_login import UserMixin
from app import db, login


class User(UserMixin, db.Model):

    id = db.Column(db.Integer, primary_key=True)
    first_name = db.Column(db.String(32), index=True)
    last_name = db.Column(db.String(32), index=True)
    username = db.Column(db.String(64), index=True, unique=True)
    email = db.Column(db.String(120), index=True, unique=True)
    password_hash = db.Column(db.String(128))
    posts = db.relationship('Post', backref='author', lazy='dynamic')

    def set_password(self, password):

        self.password_hash = generate_password_hash(password)

    def check_password(self, password):

        return check_password_hash(self.password_hash, password)

    def __repr__(self):

        return "<User {}>".format(self.username)


@login.user_loader
def load_user(id):

    return User.query.get(int(id))

Я пытался запросить таблицу User таким же образом из сеанса терминала, и, похоже, он работает нормально, поэтому я не знаю, что может быть причиной проблемы здесь. Кроме того, редактор PyCharm, похоже, выдает предупреждение о двух методах проверки 'validate_username' и 'validate_email', говоря, что методы "могут быть" статическими "". Может ли это быть как-то связано с ошибкой, которую я получаю?

1 Ответ

1 голос
/ 01 ноября 2019

Я думаю, что вы путаете синтаксис с Django здесь. В Flask-SQLAlchemy get не принимает аргументы ключевого слова - это только для запросов через PK, как вы правильно делаете в load_user. Вам нужно использовать filter.

user = User.query.filter(username=username.data).first()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...