2012-12-22 57 views
4

我正在开发一个使用Flask的SAAS应用程序,我希望用户能够创建/上传/使用他们自己的自定义模板。这是我的目录结构是怎样现在:Flask:如何从模板目录提供静态文件?

/flaskapp 
    /application.py 
    /static 
     /style.css 
    /templates (site & admin templates goes here) 
     /hello.html 
    /userdata 
     /user1 
      /template1 
       hello.html 
      /template2 
       hello.html 
     /user2 
      /template1 
       hello.html 
      /template2 
       hello.html 

我能够使用服务通过这个计算器问题找到了解决方案用户指定的模板:How to dynamically select template directory to be used in flask?,但我怎么从服务模板目录静态文件。我不想提供来自/flaskapp/static/的静态文件,而是使用/flaskapp/userdata/<user>/<current-template>/static/目录中的静态文件,并在运行时动态确定。这个怎么做?

+0

当你说'/ flaskapp/something'你的意思是网址或目录名吗?请每次都说:使用该目录中的静态文件提供此URL。否则我只是不知道你的意思。 –

+0

这里'/ flaskapp/something'是指目录而不是URL。 – anujkk

回答

0

大概你在使用Flask前面的web服务器。解决这个问题的方法之一(当我使用Apache + mod_wsgi作为自定义WSGI应用程序时,我通常使用这种方法)是直接通过Web服务器从磁盘提供目录。在Apache上,我只是使用Alias指令来做到这一点。

如果您想要改变每个用户在给定URL下提供的文件,您必须通过Flask管道文件。你必须弄清楚如何正确路由请求;之后,您可能可以使用wsgi.file_wrapper发送正确的文件(但我不确定如何通过Flask获取此文件)。

0

这是我用来从任何系统目录提供文件。

该应用程序搜索的特定目录特定所需的文件:

当有人访问HTTP

:/host/where/to/serve/files/example_file.txt应用程序将尝试返回example_file。 txt作为附件,如果该文件不存在,它将返回一个404.

您可以调整它并使用您的用户变量构建DIRECTORY_TO_SERVE_PATH。

如果您有任何限制,您还应该验证要提供的文件,因为这将返回路径中存在的任何文件。

import os 
from flask import abort, send_from_directory 


DIRECTORY_TO_SERVE_PATH = '/where/files/are/in/disk/' 


@app.route('/where/to/serve/files/<path:filename>') 
def download_file(filename): 
    if os.path.exists(DIRECTORY_TO_SERVE_PATH + filename): 
     return send_from_directory(DIRECTORY_TO_SERVE_PATH, filename, as_attachment=True) 
    else: 
     abort(404) 
相关问题