Pyramid:如何将静态视图设置为绝对路径,并允许用户上传文件到该路径?

2 投票
1 回答
853 浏览
提问于 2025-04-17 15:40

在我看来,我希望用户能够像这样创建一个新的文件,文件名为 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'(这里的 one 是一个变量名)。我觉得这是因为我定义 app_dir 这个变量时出错了。我希望 filename 是新文件的 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 个回答

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 = request.registry.settings['upload_dir']

获取到你的app_dir。把数据复制到那里,从那以后,你就可以通过/url/to/user_uploads/filename来访问这些文件了。

撰写回答