Python 如何在表单验证程序中使用当前用户

Python 如何在表单验证程序中使用当前用户,python,flask-wtforms,flask-login,Python,Flask Wtforms,Flask Login,是否有一种方法可以在自定义字段验证器中找到当前用户。这几乎就像验证程序是在没有用户的系统设置时实例化的,而不是在会话调用期间实例化的 谢谢 你试过做下面这样的事情吗?我不知道它是否有效,但它允许您在运行时定义一个静态类,并将当前用户作为参数传递给该类,该类从全局范围继承,并且不会发生变化 def form_generator(current_user): class web_form: user_email = StringFiled('Email', validator

是否有一种方法可以在自定义字段验证器中找到当前用户。这几乎就像验证程序是在没有用户的系统设置时实例化的,而不是在会话调用期间实例化的


谢谢

你试过做下面这样的事情吗?我不知道它是否有效,但它允许您在运行时定义一个静态类,并将当前用户作为参数传递给该类,该类从全局范围继承,并且不会发生变化

def form_generator(current_user):
    class web_form:
        user_email = StringFiled('Email', validators=[Email()])
        def validate_user_email(self, field)
            if Model.query.filter(field.data == current_user.email).first()
                return
            else:
                return ValidationError("Email is not current user's")
    return web_form()
在您的烧瓶路线中,然后尝试:

form = form_generator(current_user)

抱歉,这是未经测试的,我刚刚看到它并发布了回复。但如果你尝试了,请让我知道它是否成功,或者更有趣的是,它失败的原因

我还没有找到在运行时设置验证器的方法,但有一种方法可以为表单类上的字段定义验证函数,该函数可以基于构造时传递给表单的数据。这里有一个例子

class MyForm(烧瓶/烧瓶形式):
user\u id\u field=wtforms.StringField(“用户id”)
def uuu init uuuuu(自我、有效的用户id,**kwargs):
超级()
self.valid\u user\u id=valid\u user\u id
def验证用户id字段(自我,字段):
"""
函数名必须为“验证”+要验证的字段名
"""
如果field.data!=self.valid\u用户\u id
引发wtforms.validators.ValidationError(“错误的用户id!”)
#在端点定义中:
my_form=MyForm(formdata=flask.request.form,有效的_用户\u id=flask\u登录名。当前的_用户.id)
我的表单。验证()

编辑

哈,事实证明在运行时设置验证器非常容易,只是文档中没有提到它

如果您有一个带有字段
some\u field
的表单,您只需在表单的构造函数中设置
self.some\u field.validators=[…]
,例如

class MyForm(烧瓶/烧瓶形式):
some_field=wtforms.HiddenField()
定义初始值(self,一些数据,**kwargs):
超级()
self.some_field.validators=[MyValidator(some_数据)]
#终点
form=MyForm(formdata=flask.request.form,some_data=some_data)
或者,您可以直接在端点处理程序中设置验证器:

form=MyForm(formdata=flask.request.form)
form.some_field.validators=[MyValidator(some_数据)]

虽然可以在运行时添加验证器,但这不是一个好的解决方案。验证程序必须在表单初始化之后添加

在我看来,更好的解决方案是简单地使用本地进口:

class ValidateIfUserMayDoThis:
定义初始化(自我,消息):
自我信息
定义调用(自身、表单、字段):
从flask_登录导入当前用户#在此处导入!!!!
如果['Donald']中的当前_user.username:
引发验证错误(self.message)