每个表单都应该从不同的python函数(Flask)处理

每个表单都应该从不同的python函数(Flask)处理,python,forms,flask,Python,Forms,Flask,我有一个烧瓶网页,其中包括几个模态。这些情态动词包括形式。 例如,一个模式包括一个用于更改用户密码的表单。另一个模式包括用于添加新用户的表单。等 我还有几个函数可以处理从表单中获取的数据并更新数据库 我可以使用一个表单来完成,就像我使用登录表单一样: def post(self): if 'logout' in flask.request.form: flask.session.pop('username', None) flask

我有一个烧瓶网页,其中包括几个模态。这些情态动词包括形式。 例如,一个模式包括一个用于更改用户密码的表单。另一个模式包括用于添加新用户的表单。等

我还有几个函数可以处理从表单中获取的数据并更新数据库

我可以使用一个表单来完成,就像我使用登录表单一样:

def post(self):
        if 'logout' in flask.request.form:
            flask.session.pop('username', None)
            flask.flash("You've been succsessfuly logged out!")
            return flask.redirect(flask.url_for('login'))
        required = ['username', 'passwd']
        for r in required:
            if r not in flask.request.form:
                flask.flash("Error: {0} is required.".format(r))
                return flask.redirect(flask.url_for('login'))
        username = flask.request.form['username']
        passwd = flask.request.form['passwd']
        if username in users and users[username] == passwd:
            flask.session['username'] = username
            flask.flash("Login Succsessful!")
            userID = database().getID(username)
            flask.session['userID'] = userID
            flask.session['userEmail'] = database().getEmail(userID)
            flask.session['mNumber'] = database().getmNumber(userID)
            return flask.redirect(flask.url_for('index'))
        else:
            flask.flash("Username doesn't exist or incorrect password")
        return flask.redirect(flask.url_for('login'))
但这里我只有两个变量,用户名和密码。两者都是必需的,我知道输入将只是这些变量

在带有modals的页面上,如果用户填写“更改电子邮件”表单,则唯一的输入将是电子邮件地址。如果用户填写“更改密码”表格。唯一的输入是密码,而不是电子邮件


我现在的问题是,如何在flask应用程序中确定用户填写的表单,以便我可以相应地处理数据?

要区分用户发送给您的表单,可以引入一个字段。您可以将同名字段添加到所有需要的表单中,将其命名为“目标”或“表单”,并在其中存储表单名称。字段应呈现为隐藏的输入元素。然后在flask代码中使用if/elif/else来读取输入值,并决定它是哪种形式

还有更干净的解决方案:使用WTForm或Django表单。他们的做法是不同的,在每个输入名称中添加表单前缀,这样就不会再有关于发送了哪个表单以及谁需要处理数据的问题了。你为什么不用一个呢?他们还有很多额外的好处

为了解释第一种解决方案,以下是引导示例库中的示例表单:

<form class="form-signin" role="form">
    <h2 class="form-signin-heading">Please sign in</h2>
    <label for="inputEmail" class="sr-only">Email address</label>
    <input type="email" id="inputEmail" class="form-control" placeholder="Email address" required autofocus>
    <label for="inputPassword" class="sr-only">Password</label>
    <input type="password" id="inputPassword" class="form-control" placeholder="Password" required>
    <div class="checkbox">
      <label>
        <input type="checkbox" value="remember-me"> Remember me
      </label>
    </div>
    <button class="btn btn-lg btn-primary btn-block" type="submit">Sign in</button>
</form>

请登录
电子邮件地址
密码
记得我吗
登录

您可以做的是在表单中添加新的隐藏字段:
用于登录表单。然后在Flask处理程序中读取该值
Flask.request.form.get('target')
-如果它是“signin”,您可以确保正在处理登录表单。以此类推,对于页面上的其他类型的表单

对于我当前的表单,我使用bootstrap进行样式设置。将WTForms与Bootstrap集成容易吗?如果您有时间的话,您能给我举一个您的第一个解决方案的例子吗?这样我就可以确切地理解您的想法了。Bootstrap可以帮助您调整网页上的内容,并在服务器端使用表单包装功能来隔离表单验证逻辑。它们不会相互干扰,应该可以很好地协同工作。忘记这个例子吧。这就是你的意思,对吗?谢谢你,我现在将使用你的第一个解决方案,直到我得到WTForms的工作解决方案。您的解决方案将被标记为已接受。谢谢你的帮助!确切地您可以轻松地读取这些附加值,并根据需要使用它们