【问题标题】:How to serve any static directory containing web pages in django?如何在 django 中提供任何包含网页的静态目录?
【发布时间】:2015-09-01 14:37:37
【问题描述】:

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

  1. 管理员通过管理界面上传包含 Web 内容(整个静态网站)的 zip 存档
  2. 存档在后台解压到随机目录
  3. 静态内容在看起来像http://<host>/site/<user-friendly-url>/ 的 url 上提供,index.html 位于根目录,css 和 js 文件的所有路径等。

我知道如何配置路由,但我想知道在视图中放置什么。我尝试过使用 STATIC_{ROOT,URL} 和 MEDIA_{ROOT,URL} 但我觉得这不是正确的方法。

总之:有没有办法在视图中放置return serve_this_static_directory() 之类的东西?或者有什么解决方法吗?

感谢您的回答

编辑:

试图澄清我的问题。

  1. 网址 (http://<host>/site/<user-friendly-url>/) 与目录名称不匹配(可以是任何名称,例如 XYZ_html/)。
  2. 管理员必须能够上传新的档案,这些档案应该被自动提取和提供。

出于这两个原因,我不知道如何使用网络服务器提供此内容,因为那如何配置路由呢?

【问题讨论】:

    标签: html django django-staticfiles


    【解决方案1】:

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

    接下来要做的是配置您的 HTTP 服务器以提供“/path/to/your/project/public”以及您域的根 URL 上的任何文件,而不是在找不到文件时提供 404 错误,它应该重定向到 django(因此,如果路径 /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 应用的 MEDIA_* 设置:

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

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

    【讨论】:

    • 感谢您的回答,但我相信它不能解决问题:我编辑了问题以使其更清晰
    • 如果你想要django中友好的URL,你可以使用nginx内置的internal redirection。 Apache 中也存在类似的机制。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-04-18
    • 1970-01-01
    • 2017-11-22
    • 2020-07-20
    • 1970-01-01
    • 2015-08-19
    • 1970-01-01
    相关资源
    最近更新 更多