python - 在 Query.Get 上获取 TypeError“意外的关键字参数”
问题描述
我正在关注这个 Flask Mega-Tutorial 并且在某种程度上遇到了问题。我正在使用 PyCharm CE for 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'
它来自 forms.py 模块中的自定义验证方法“def validate_username”。我猜它无法在 models.py 模块的 User 类中“找到”“用户名”项?
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))
我已经尝试从终端会话中以相同的方式查询用户表,它似乎工作正常,所以我不知道是什么导致了这里的问题。此外,PyCharm 编辑器似乎对两种验证方法 'validate_username' 和 'validate_email' 发出警告,称这些方法“可能是'静态'”。这与我遇到的错误有什么关系吗?
解决方案
我认为您在此处将语法与 Django 混淆了。在 Flask-SQLAlchemy 中,get
不接受关键字参数 - 它仅用于通过 PK 进行的查询,正如您在load_user
. 你需要使用filter
.
user = User.query.filter(username=username.data).first()
推荐阅读
- c# - System.StackOverflowException,当获取设置属性时使用
- angular - 如何在 Angular 中为 ngx-datatable 标头设置 colspan 和 rowspan?
- vue.js - Vuex 突变应该是函数,但“mutations.default”是 {}
- azure - Azure 函数计时器触发器未在 CRON 表达式上正确执行
- c# - C# 中的 Zip 数组和混合数组
- android - 如何传递整数?
- java - Liferay 7 - 在 Authenticator 类中设置共享会话属性
- utf-8 - 客户端字符集和服务器字符集如何相关?
- python - Python Double for循环将新行添加到新的Numpy数组
- python - 如何将张量板可视化集成到 tf.Estimator?