要回答我的问题(虽然有可能是我只是不知道一个简单的和更好的方法,但这里是我落得这样做,现在)...
我创建了一个自定义路由转换器(用于执行此操作的方法描述为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"
这似乎是工作,但我还是觉得我只是缺少从瓶的东西很明显,不会要求创建一个自定义转换器...
千万不要错过' 'form.data''到视图,通过''form.field.data''。用你的字段名替换该字段 –
@AliFaki哦,我明白了......一次只传一个并在路由中自己构建查询字符串?例如'@ main.route('/ search/results?field1 =&field2 = &field3 = ')' –
KaleidoEscape