Flask / Python - 处理下拉列表以打开不同的HTML页面

时间:2016-02-08 07:35:42

标签: python html flask

我正在学习烧瓶和Python以及HTML和CSS。我有一个Flask模板来渲染一个下拉列表。

我需要做的是:当您从下拉列表中选择一个值时,它会打开一个与所选值对应的新HTML页面(选择不同选项的不同页面)。

我尝试在网上搜索,但无法获得太多资源。当我通过提交按钮提交下拉选项时,页面会显示错误消息:

不允许的方法

请求的网址不允许使用此方法。

请引导我找到最佳解决方案。

以下是我的代码。

pro.html

    <form name="startpage" method="POST" action="">
    <div class="form-group">
        <div class="input-group">
            <select name = "method_cipher" id = "method_cipher"> 
                <option value="Encrypt">Encrypt</option>
                <option value="Decrypt">Decrypt</option>
            </select>
            <select name = "cipher_type" id = "cipher_type"> 
                <option value="Caesar">Caesar</option>
                <option value="Transposition">Transposition</option>
                <option value="Reverse">Reverse</option>
            </select>
        </div>
        <button type="submit" name="submit" value="success" class="btn btn-default">Submit</button>
    </div>
    </form> 

test.py

    import flask
    APP = flask.Flask(__name__)
    @APP.route('/')
    def index():
        return flask.render_template('pro.html')
    @APP.route("/test" , methods=['GET', 'POST'])
    def test():
        if flask.request.method == 'POST':
            select = flask.request.form.get('method_cipher')
            if(select == 'Encrypt'):
                return flask.render_template('lastpage.html')
    if __name__ == '__main__':
        APP.debug=True
        APP.run()

编辑 - 我想为用户选择的不同下拉选项打开不同的网页(HTML页面),例如当用户选择“加密”并提交时我想打开“lastpage.html”,如果他选择“解密”然后任何其他页面等等不同的选项。但事情并非如此。

2 个答案:

答案 0 :(得分:3)

pro.html中的表单会将数据发送到action属性指定的网址。如果您将其保留或将其设置为空字符串,则请求将转到/的同一页面。

但是您已经在不同的视图函数中设置了表单处理。你可能想发帖到那个。

因此,请将表单更改为发布到正确的网址

<form ... action="/test" ...>

这样可行,但在模板中对目标网址进行硬编码并不是一个好主意。我假设您正在使用jinja,因此您可以让它为您插入网址

<form ... action="{{ url_for("test") }}" ...>

如果您还没有,请查看url_for功能。

答案 1 :(得分:0)

只需这样做

<select onchange ="if (this.value)window.location.href=this.value">
    <option value="/target1">test1<option>
    <option value="/target2">test2<option>
</select>