现在我有这样的表格:
<form action="/store_stl_data" method="post" accept-charset="utf-8"
enctype="multipart/form-data">
<label for="stl">STL</label>
<input id="stl" name="stl" type="file" value="" />
<input type="submit" value="submit" />
</form>
然后在我的views.py
我有
@view_config(route_name='store_stl_data', renderer='templates/edit')
def store_stl_data(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')]
...(parsing data)...
return data
def store_stl_data(request):
下的三行是我最不确定的。我是从this tutorial得到的。
我想要它,以便当人们上传文件时,整个store_stl_data
函数运行并处理输入文件。
现在它给了我一个错误:
KeyError: "No key 'stl': Not a form request"
此处是我的路线,__init__.py
:
from pyramid.config import Configurator
from sqlalchemy import engine_from_config
from .models import (
DBSession,
Base,
)
def main(global_config, **settings):
""" This function returns a Pyramid WSGI application.
"""
engine = engine_from_config(settings, 'sqlalchemy.')
DBSession.configure(bind=engine)
Base.metadata.bind = engine
config = Configurator(settings=settings)
config.add_static_view('static', 'static', cache_max_age=3600)
config.add_route('view_wiki', '/')
config.add_route('view_page', '/{pagename}')
config.add_route('add_page', '/add_page/{pagename}')
config.add_route('edit_page', '/{pagename}/edit_page')
config.scan()
return config.make_wsgi_app()
答案 0 :(得分:1)
从请求中获取的.file
对象已经是一个打开的文件(如)对象。
如果仔细查看链接到的文档中的示例,它会使用上载文件名创建 new 文件,并使用上传的文件将数据写入该新文件。 input_file
永远不会在该代码中打开,只有output_file
(注意那里的变量名称不同)。
您也不需要关闭文件对象,因此不需要with
。您的代码可以简化为:
def store_stl_data(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')]
我个人不使用itertools.tee
,但是,在构建顶点时,您正在将整个文件读入tee
缓冲区。
相反,我会使用一个循环:
def store_stl_data(request):
input_file=request.POST['stl'].file
vertices, normals = [], []
for line in input_file
parts = line.split()
if parts[0] == 'vertex':
vertices.append(map(float, parts[1:4]))
elif parts[0] == 'facet':
normals.append(map(float, parts[2:5]))
现在一次只有一行保留在内存中(加上顶点和法线结构)。
注意:如果收到KeyError: No key '...': Not a form request
错误消息,则视图不会收到POST
HTTP请求。请仔细检查您的表单方法是否设置为"POST"
(大小写无关紧要)。