我只是在学习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"
答案 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中一些不需要创建自定义转换器的东西...