可以根据语言 cookie 内容有条件地构建一个烧瓶 "WTForms class"

Possible to build a flask "WTForms class" conditionally based on language cookie content

在我的 FLask 应用程序中,我使用 Cookie 来设置语言。

因此我能够调用路由并呈现模板,将 languagecookie 的值传递给模板,并使用 HTML 模板中的条件 jinja IF 语句呈现它。

我还使用 WTForms 在我的模板中构建和呈现表单(例如联系表单)

@app.route('/contact', methods=['GET'])
def contact():
    languageCookie = request.cookies.get('language')    
    form = ContactForm()        
    return render_template('contact.html', language=languageCookie, ContactForm = form)


class ContactForm(FlaskForm):
    Name = StringField('Naam', 
        validators=[InputRequired(message="Een naam is verplicht"),
        Length(min=2, max=25, message="Minimum 2 en maximum 25 characters")], 
        render_kw={'class':'form-control g-color-black g-bg-white g-bg-white--focus g-brd-gray-light-v4 g-brd-primary--focus rounded-3 g-py-13 g-px-15','placeholder':'Naam'}) 

我的问题是,是否可以根据语言 cookie 的值更改此 WTForm class 中的内容?

例如在验证器中更改字段的消息值等

已经尝试过,但没有成功,因为 cookie 在路由之外没有引用。 让 WTForms class 具有语言意识的更好方法应该是什么?

非常感谢!

这是我测试过的解决方案:

@app.route('/contact')
def contact():
    languageCookie = request.cookies.get('language')
    form = ContactForm(languageCookie)
    return render_template('contact.html', language=languageCookie, ContactForm=form)


name_field = {
    'language1': {
        'label': 'label in language 1',
        'required_message': 'required_message in language 1',
        'length_message': 'length_message in language 1',
        'placeholder': 'placeholder in language 1'
        },
    'language2': {
        'label': 'label in language 2',
        'required_message': 'required_message in language 2',
        'length_message': 'length_message in language 2',
        'placeholder': 'placeholder in language 2',
        }
    }

def ContactForm(language):
    class Form(FlaskForm):
        name = StringField(name_field[language]['label'],
            validators=[
                InputRequired(message=name_field[language]['required_message']),
                Length(min=2, max=25, message=name_field[language]['length_message'])
            ],
            render_kw={'class': 'classes', 'placeholder': name_field[language]['placeholder']})

    return Form()

您创建实际表单 class 并在一个函数中实例化 class,每次用户查看 /contact 时都会调用该函数。我不推荐这样做,因为你必须为每个字段创建一个字典,这可能会变得乏味。

如果你想向用户显示相同的消息,但翻译成他们的语言,我会使用 flask-babel 来为你处理翻译。最初需要做更多的工作,但将来会让您的生活更轻松。这是一个tutorial.

您可以通过更改 get_locale 函数

来合并您的 cookie 系统
@babel.localeselector
def get_locale():
    return request.cookies.get('language')