最终,我希望当用户上传文件时,它会解析该文件,然后创建一个新的 url(使用 save_url
),在其中显示该解析的输出。
这是呈现表单的 edit.pt:
<form action="/add_page" method="post" accept-charset="utf-8" enctype="multipart/form-data">
<label for="stl">Stl</label>
<input name="stl" type="file" value="" />
<input type="submit" value="submit"/>
</form>
这是 views.py
的 add_page
部分:
@view_config(route_name='add_page', renderer='templates/edit.pt')
def add_page(request):
input_file=request.POST['stl'].file
i1, i2 = itertools.tee(input_file)
vertices = [map(float, line.split()[1:4])
for line in i1
if line.lstrip().startswith('vertex')]
normals = [map(float, line.split()[2:5])
for line in i2
if line.lstrip().startswith('facet')]
ordering=[]
N=len(normals)
...(parsing data)...
return data
if data is None:
displayNotification['please upload file']
if 'stl' in request.params:
name=request.params('name')
page=Page(name,data)
return HTTPFound(location=request.route_url('view_page',pagename=name))
save_url=request.route_url('add_page',pagename=name)
page=Page('','')
return dict(page=page,save_url=save_url)
当我尝试访问 http://localhost:6543/add_page/new
(使用新网址添加新页面)时,我收到此错误:
KeyError: "No key 'stl': Not a form request".
此错误发生在 def add_page(request):
下的行。我将其格式化为 this tutorial 。
最佳答案
“在表单提交上保存数据后要做什么”基本上有两种情况:
您将数据(例如,文件解析的结果)保存到某个永久存储(数据库),这将为您提供一些唯一的 URI 来寻址该文件(例如,
/files/123123
)。然后您只需向该位置发出 HTTP 重定向即可:@view_config(renderer="templates/form_view.pt") def form_view(self): if self.request.method == 'POST': if _validation_passed(request): new_url = _save_data(request) return HTTPFound(new_url) else: return _render_form(values=request.POST, msg="Validation failed") # We are a GET not a POST, render empty form return _render_form()
新“页面”将永久保留,因此如果您只需在浏览器中访问 /files/123123
,您就会看到相同的页面。
或者,您的 View 接收一个 HTTP post,对数据执行一些操作,而不是重定向到另一个 View ,而是像任何其他“普通” View 一样返回一个 HTML block 。例如,当表单验证失败并且您想要重新显示表单时,就会使用此方法,但当您不在任何地方保存数据时也很有用,因此基本上您没有可重定向到的 URI。
@view_config(renderer="templates/form_view.pt") def form_view(self): if self.request.method == 'POST': if _validation_passed(request): return _render_data(request) else: return _render_form(values=request.POST, msg="Validation failed") # We are a GET not a POST, render empty form return _render_form()
在这种情况下,结果页面仅在文件提交后可见,要再次查看,用户需要重新上传文件。
只要遵循其中一种模式,您就能解决问题。
文件提交还有一个额外的复杂性 - 如果不采取一些技巧将文件存储在服务器上的临时位置,通常无法重新显示填充了文件字段的表单。
关于python - 如何放入一个表单来解析用户上传的文件,然后将其显示在新的 URL 上?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14395115/