2016-02-11 49 views
0

我刚学习Flask,我想在我的视图中有两个页面:搜索页面有一个表单,用户可以在其中输入一些参数,而视图结果页面(其中I还没有写入)只会显示搜索结果。将数据重定向到Flask中的下一个视图

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

当我通过form.dataview_results(),下面,我得到的形式在该URL和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" 
+0

千万不要错过' 'form.data''到视图,通过''form.field.data''。用你的字段名替换该字段 –

+0

@AliFaki哦,我明白了......一次只传一个并在路由中自己构建查询字符串?例如'@ main.route('/ search/results?field1 = &field2 = &field3 = ')' – KaleidoEscape

回答

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发送数据(这是该数据去上岗)一起的结果视图。我使用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" 

这似乎是工作,但我还是觉得我只是缺少从瓶的东西很明显,不会要求创建一个自定义转换器...

相关问题