如何在django中提供包含网页的任何静态目录?

时间:2015-09-01 14:37:37

标签: html django django-staticfiles

我正在开发一个我们希望发生以下情况的应用程序:

  1. 管理员通过管理界面
  2. 上传包含网页内容(整个静态网站)的zip档案
  3. 存档在后台解压缩到随机目录
  4. 静态内容在一个类似http://<host>/site/<user-friendly-url>/的网址上提供,其中index.html位于根目录,所有路径指向css和js文件等。
  5. 我知道如何配置路由,但我想知道在视图中放置什么。我尝试过STATIC_ {ROOT,URL}和MEDIA_ {ROOT,URL},但我觉得这不是正确的方法。

    总结:有没有办法在视图中添加return serve_this_static_directory()之类的内容?或者那里有解决方法吗?

    感谢您的回答

    修改

    试图澄清我的问题。

    1. 网址(http://<host>/site/<user-friendly-url>/)与目录名称不匹配(可能是XYZ_html/)。
    2. 管理员必须能够上传新档案,应自动提取和提供这些档案。
    3. 由于这两个原因,我不知道如何使用网络服务器提供这些内容,因为如何配置路由呢?

1 个答案:

答案 0 :(得分:1)

首先,您必须意识到django默认不会为您的静态或媒体文件提供服务,您应该使用您的HTTP服务器(nginx,apache或其他)。

接下来要做的是将您的HTTP服务器配置为&#34; / path / to / your / project / public&#34;以及域中根URL内的任何文件,如果找不到文件,它应该重定向到django而不是服务404错误(所以如果路径/ site / something /中有一些文件,你的HTTP服务器应该提供该文件,如果没有,它会提供任何django将在该路径上输出的内容.nginx的示例配置可能如下所示:

server {

    listen 80;
    server_name oskar.local;

    root /path/to/your/project/public;



    location @default {
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header Host $http_host;
        proxy_redirect off;
        include /etc/nginx/uwsgi_params;

        uwsgi_pass app_server; # or some proxy_pass if you're not using uwsgi
        break;
    }
    location / {
        try_files $uri @default;
    }
}

最后一步是配置您的django app的MEDIA_ *设置:

MEDIA_ROOT = "/path/to/your/project/public"
MEDIA_URL = "/"

但要小心!使用这种方法存在潜在的漏洞:任何用户都可以将文件放入通常由django处理的路径中。更好的方法是将所有&#34;子网站&#34;在某个子目录或单独的域中。