Python Flask - 处理从后端前端获得的输入

时间:2016-06-10 17:31:09

标签: python flask backend

这更像是一个问题,关于在哪里找到我将如何做而不是询问如何做到这一点。我确信这很好,我只是在努力表达我可以用来谷歌的正确用语并找出答案。

无论如何 - 我有一个Python Flask Web应用程序。在网页上,有一个请求用户输入的输入框。我想要发生的是,在后台用户输入会发生一些魔术。在我自己的场景中,我想获取一个URL,然后使用bs4来挑选我需要的内容并在网页上显示。

为简单起见,我会要求简单的东西,然后我可以从那里开始:如果我要求用户指定一个数字然后按“提交”,我怎么能将数字乘以10?

如果表单的代码是index.html

<form class="form-horizontal" role="form" method="post" action="/">
    {{ form.csrf_token }}
        <fieldset>
            <div class="form-group">
                <label for="GetNum" class="col-lg-2 control-label">Enter Number</label>
                    <div class="col-lg-6">
                        <input type="text" id="GetNum" name="GetNum" class="form-control" value="">
                    </div>
                <input class="btn btn-success" type="submit" value="Calculate">
            </div>
        </fieldset>
</form>

我注意到我可以通过<p>form.request.GetNum</p>获取要打印到段落的输入。

现在对于这个问题的示例,后端功能的代码将是:

import math
GetNum = 10  #should be form.request.GetNum value
CalcResult = GetNum*1000
print CalcResult  #  or {{ CalcResult.data }} or something in index.html

我的控制器(app.py)看起来像:

@app.route('/', methods=['GET', 'POST'])
@login_required
    def home():
    error = None
    form = PostForm(request.form)  # unrelated to question, but will this clash?
    if .. :
        do something
        return redirect(..)
    else:
        do something else..
        return render_template(..)       

我担心的是,如果必须将数学函数放在那里,home函数将最终拥有大量代码。那么tl; dr,我如何在我的代码中实现后端函数? (或者请提供材料阅读,谢谢!)

另一件事是我的'/'页面上已经有一个表单,我是否必须重命名form1 form2之类的表单,因为它们会发生冲突或者它会没问题?

1 个答案:

答案 0 :(得分:0)

在您的代码库中的其他位置,可以在同一个文件中,也可能更有可能 您可以定义该复杂任务的模块或包。让我们 在与您的目录相同的目录中创建一个简单的模块complicated.py 其他代码,然后定义复杂的任务:

def do_really_complicated_thing(info):
    # lots of complicated steps
    return really_complicated_data

然后在我们的视图代码中,我们可以使用它而不是嵌入它:

from complicated import do_really_complicated_thing

@app.route('/', methods=['GET', 'POST'])
@login_required
    def home():
    error = None
    form = PostForm(request.form)
    if form.validate_on_submit() :
        info = form.info.data
        complicated_task = do_really_complicated_thing(info)
        return render_template('something', results=complicated_task)

因此,简而言之,您正在寻找的术语是包和模块,它们 帮助您的代码整洁和可重复使用。

至于碰撞形式 - 你可以只是将表格定位到一个特定的路线上,该路线只处理那个形式,这比在一条路线中验证/解析不同形式要清晰得多。