金字塔:如何将静态视图设置为某个绝对路径,然后让用户将文件上传到该路径?

时间:2013-02-12 23:23:34

标签: python pyramid

在我的可调用视图中,我希望用户能够创建一个名为filename的新文件,如下所示:

@view_config(route_name='home_page', renderer='templates/edit.pt')
def home_page(request):
    if 'form.submitted' in request.params:
        name= request.params['name']

        input_file=request.POST['stl'].filename
        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]))

        ordering=[]
        N=len(normals)

        ...parsing data...

        data=[vertices,ordering]
        jsdata=json.dumps(data)
        renderer_dict = dict(name=name,data=jsdata)
        app_dir = request.registry.settings['upload_dir']
        filename =  "%s/%s" % ( app_dir , name )
        html_string = render('tutorial:templates/view.pt', renderer_dict, request=request)
        with open(filename,'w') as file:
                file.write(new_comment)
        return HTTPFound(location=request.static_url('tutorial:pages/%(pagename)s.html' % {'pagename': name}))

    return {}   

现在,当我尝试上传文件时,我收到此错误消息:IOError: [Errno 2] No such file or directory: u'/path/pages/one'(一个是名称变量)我相信这是因为我错误地定义了app_dir变量。我希望filename是使用上面定义的name变量创建的新文件的url(以便可以在www.domain.com/pages/name上访问它)。这是我的应用程序的文件结构:

 env
    tutorial
        tutorial
            templates
                home.pt
            static
                pages
                    (name1)
                    (name2)
                    (name3)
                     ....
            views.py
            __init__.py

init .py中,我有:

config.add_static_view(name='path/pages/', path=config.registry.settings['upload_dir'])

在我的development.ini文件中,我有

[app:main]
use = egg:tutorial

upload_dir = /path/pages

编辑:如果有人知道为什么这个问题没有引起太多关注,我很乐意听到。

1 个答案:

答案 0 :(得分:4)

虽然我觉得您可能对如何提供用户生成的内容有误解,但我会告诉您一种方法来做您要求的事情。一般情况下,用户生成的内容不会上传到您的来源,您可以在外面提供一些可配置的位置,如下所示。

通过INI文件使路径可配置:

[app:main]
use = egg:tutorial

upload_dir = /path/to/writable/upload/directory

添加可以提供该目录下的文件的静态视图。

config.add_static_view(name='/url/to/user_uploads', path=config.registry.settings['upload_dir'])

在上传视图中,您可以通过

获取app_dir
app_dir = request.registry.settings['upload_dir']

将数据复制到那里,从那时起,它将在/url/to/user_uploads/filename处可用。