将数据重定向到Flask中的下一个视图

时间:2016-02-11 22:46:07

标签: python-3.x flask

我只是在学习Flask,我希望在我的视图中有两个页面:搜索页面有一个用户可以输入一些参数的表单,而视图结果页面(我还没写过)将只是显示搜索结果。

现在我无法通过搜索页面将表单数据重定向到视图结果页面。我希望视图结果页面位于其中包含查询字符串的URL,例如/search/?=...,然后,当然,我需要能够在view_results()中轻松访问该数据。

当我将form.data传递给view_results()时,如下所示,我在网址和data中获得了表单字典的字符串表示...我认为这是有意义的..但不是我想要的。我想我误解了这个......

@main.route('/search/', methods=['GET', 'POST'])
def search():
    form = SearchForm()
    if form.validate_on_submit():
        return redirect(url_for('.view_results', data=form.data))
    return render_template('search.html', form=form)

@main.route('/search/<data>')
def view_results(data):
    return "placeholder"

1 个答案:

答案 0 :(得分:0)

回答我自己的问题(虽然可能有一种更简单,更好的方式,我不知道,但这就是我现在最终做的事情)...

我创建了一个自定义路由转换器(执行此操作的方法描述为here),并将其注册在我的应用中,以便我可以在view_results()路由中使用它。我将此添加到我的utils.py,我在与我的应用初始化相同的目录中:

from werkzeug.routing import BaseConverter

class DictionaryConverter(BaseConverter):
    """Convert python dictionary to URL query string and back."""

    def to_python(self, value):
        d = {}
        for item in value.split('&'):
            k, v = item.split('=')
            if k != 'csrf_token':
                d[k] = v
        return d

    def to_url(self, values):
        pairs = []
        for k in values:
            #don't expose the csrf token in the query string
            if k != 'csrf_token':
                pairs.append('{}={}'.format(k, values[k]))
        return '&'.join(BaseConverter.to_url(self, value=pair) for pair in pairs)

然后在我的应用__init__.py中,我确保在初始化应用后注册自定义转换器,但在加载使用它的蓝图之前(我的main蓝图):

app = Flask(__name__)

# ...

from .utils import DictionaryConverter
app.url_map.converters['dict'] = DictionaryConverter

from .main import main as main_blueprint
app.register_blueprint(main_blueprint)

我的搜索视图将数据从request.form(数据用于POST的位置)发送到结果视图。我使用code=303来消除歧义和make certain the request is sent as a GET,但这可能不是什么大问题。

@main.route('/search/', methods=['GET', 'POST'])
def search():
    form = SearchForm()
    if form.validate_on_submit():
        return redirect(url_for('.view_results', data=request.form), code=303)
    return render_template('search.html', form=form)

最后,我的结果视图使用了新的转换器,然后我可以按照惯例访问数据(正如您所看到的,我还没有真正用它做任何事情,但现在我应该能够启动):

@main.route('/search/results?<dict:data>')
def view_results(data):
    for i in data:
        print(i, data[i])
    return "placeholder"

这似乎有效,但我仍然觉得我只是遗漏了Flask中一些不需要创建自定义转换器的东西...