将 python 列表传递给烧瓶视图不起作用

Posted

技术标签:

【中文标题】将 python 列表传递给烧瓶视图不起作用【英文标题】:Passing a python list to a flask view is not working 【发布时间】:2018-06-19 01:41:28 【问题描述】:

我有一个非常简单的烧瓶表单设置,带有 1 个字段。该字段通过 POST 请求传递给脚本,该脚本运行并将 render_template 返回到结果页面,并从脚本传递 4 个列表对象。

我可以在 python 解释器中运行脚本并打印列表的值。但是,它似乎没有将列表传递回视图。我不断收到表单未定义的错误。我认为它只是跳到索引路由中的返回函数,而不是从函数返回视图。在发送到视图之前,我需要对列表变量做些什么吗?

路线

@app.route('/', methods=['GET', 'POST'])
def index():
    form = Search()
    if form.validate_on_submit():
        name=request.form['name']
        smoothSearch(name)
    return render_template("index.html", form=form)

功能

#function runs a for loop appending items to each list item then returns a render_template shown below
else:
    return render_template("results.html", usernames=usernames, userHandle=userHandle, userText=userText, postTime=postTime)

编辑以在下面包含 jinja2 引用

jinja2.exceptions.UndefinedError jinja2.exceptions.UndefinedError: 'form' 未定义

Traceback(最近一次调用最后一次) 调用中的文件“/home/user/temp/code-projects/smoothSearch/lib/python3.5/site-packages/flask/app.py”,第 1997 行 return self.wsgi_app(environ, start_response)

文件“/home/user/temp/code-projects/smoothSearch/lib/python3.5/site-packages/flask/app.py”,第 1985 行,在 wsgi_app response = self.handle_exception(e)

文件“/home/user/temp/code-projects/smoothSearch/lib/python3.5/site-packages/flask/app.py”,第 1540 行,在 handle_exception 中 reraise(exc_type, exc_value, tb)

文件“/home/user/temp/code-projects/smoothSearch/lib/python3.5/site-packages/flask/_compat.py”,第 33 行,在 reraise 提升价值

文件“/home/user/temp/code-projects/smoothSearch/lib/python3.5/site-packages/flask/app.py”,第 1982 行,在 wsgi_app 响应 = self.full_dispatch_request()

文件“/home/user/temp/code-projects/smoothSearch/lib/python3.5/site-packages/flask/app.py”,第 1614 行,在 full_dispatch_request rv = self.handle_user_exception(e)

文件“/home/user/temp/code-projects/smoothSearch/lib/python3.5/site-packages/flask/app.py”,第 1517 行,在 handle_user_exception reraise(exc_type, exc_value, tb)

文件“/home/user/temp/code-projects/smoothSearch/lib/python3.5/site-packages/flask/_compat.py”,第 33 行,在 reraise 提升价值

文件“/home/user/temp/code-projects/smoothSearch/lib/python3.5/site-packages/flask/app.py”,第 1612 行,在 full_dispatch_request rv = self.dispatch_request()

文件“/home/user/temp/code-projects/smoothSearch/lib/python3.5/site-packages/flask/app.py”,第 1598 行,在 dispatch_request 返回 self.view_functionsrule.endpoint

文件“/home/user/temp/code-projects/smoothSearch/app.py”,第 22 行,在索引中 平滑搜索(名称)

文件“/home/user/temp/code-projects/smoothSearch/smoothSearch.py​​”,第 31 行,在 smoothSearch 中 return render_template('results.html', usernames=usernames, userHandle=userHandle, userText=userText, postTime=postTime)

文件“/home/user/temp/code-projects/smoothSearch/lib/python3.5/site-packages/flask/templating.py”,第 134 行,在 render_template 上下文,ctx.app)

文件“/home/user/temp/code-projects/smoothSearch/lib/python3.5/site-packages/flask/templating.py”,第 116 行,在 _render rv = template.render(context)

文件“/home/user/temp/code-projects/smoothSearch/lib/python3.5/site-packages/jinja2/environment.py”,第 1008 行,在渲染中 return self.environment.handle_exception(exc_info, True)

文件“/home/user/temp/code-projects/smoothSearch/lib/python3.5/site-packages/jinja2/environment.py”,第 780 行,在 handle_exception reraise(exc_type, exc_value, tb)

文件“/home/user/temp/code-projects/smoothSearch/lib/python3.5/site-packages/jinja2/_compat.py”,第 37 行,在 reraise raise value.with_traceback(tb)

***模板代码中的文件“/home/user/temp/code-projects/smoothSearch/templates/results.html”,第 1 行 % 扩展“index.html”%

***模板代码中的文件“/home/user/temp/code-projects/smoothSearch/templates/index.html”,第 17 行 form.csrf_token

文件“/home/user/temp/code-projects/smoothSearch/lib/python3.5/site-packages/jinja2/environment.py”,第 430 行,在 getattr 返回 getattr(obj, 属性)

jinja2.exceptions.UndefinedError: 'form' 未定义

【问题讨论】:

【参考方案1】:

假设您的 FunctionsmoothSearch(...) 的结尾,您需要在函数调用前添加一个 return 语句。

@app.route('/', methods=['GET', 'POST'])
def index():
    form = Search()
    if form.validate_on_submit():
        name=request.form['name']
        return smoothSearch(name)
    return render_template("index.html", form=form)

问题更新后编辑:

从您的回溯中,您可以看到在 index.html 的第 17 行有一个对 form.csrf_token 的调用。由于您没有将 form 传递给您的模板,因此它会抛出您的错误。从您的index.html 中删除它可以解决此错误,但它很可能会破坏您拥有的任何表单。您必须将form.csrf_token 添加回您的所有表单中。

【讨论】:

感谢您的回复,但我得到相同的 jinja2 UndefinedError 说表单丢失。 您能否确认正在联系return render_template("results.html"...?你也可以发布回溯和jinja2模板吗? 我已将引用作为对帖子的编辑发布。不,我无法确认已达到 render_template。这可能是超时问题吗?也许脚本完成并退出到 index.html 路由的时间太长? 我最终只是删除了 % extends index.html % 以便它不会通过它。非常感谢您的帮助!

以上是关于将 python 列表传递给烧瓶视图不起作用的主要内容,如果未能解决你的问题,请参考以下文章

将 NSManagedObject 传递给子上下文不起作用

将 JSON 传递给 PHP 不起作用

如何在视图控制器之间传递数据 - 不起作用

即使我将字符串方法传递给参数python,它也不起作用

将参数从 servlet 传递给函数 Javascript,查看数据库时它不起作用?

CSV列表的书写在Python 2.7中不起作用