python - 如何放入一个表单来解析用户上传的文件,然后将其显示在新的 URL 上?

标签 python file-upload url-routing pyramid

最终,我希望当用户上传文件时,它会解析该文件,然后创建一个新的 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.pyadd_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

最佳答案

“在表单提交上保存数据后要做什么”基本上有两种情况:

  1. 您将数据(例如,文件解析的结果)保存到某个永久存储(数据库),这将为您提供一些唯一的 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,您就会看到相同的页面。

  1. 或者,您的 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/

相关文章:

python - Tkinter 复选框问题

python - 将不同的列值堆叠到 Pandas 数据框中的一列中

python - numpy中矩阵和一维数组之间的点积

c# - 上传大文件时抛出“System.OutOfMemoryException”

将文件共享到任何可能的应用程序的 iOS native 方式

类似 Twitter/Facebook 的 jQuery 页面导航

javascript - 如何使用reactjs和react-router实现正确的布局

python - 如何在 Python 3 中一次迭代两个列表?

python - 获取字节对象而不是上传的文件

javascript - 可以将backbone.js与动态/通配符子域路由一起使用吗?