python - 使用 apache 和 mod_wsgi 提供静态文件而不更改 apache 的配置?

标签 python django apache .htaccess mod-wsgi

我有一个 Django 应用程序,并且使用共享服务器托管,因此我无法更改 apache 的配置文件。我唯一可以更改的是应用程序中的 .htaccess 文件。我还有一个标准的 django.wsgi python 文件作为入口点。

在开发环境中,我使用 Django 来提供静态文件,但官方文档中不鼓励这样做,说您应该使用 Web 服务器来执行此操作。

有没有一种方法可以通过 apache 提供静态文件,而无需访问 Apache 的配置,仅更改 .htaccess 或 django.wsgi 文件?

最佳答案

第一步是添加

AddHandler wsgi-script .wsgi

到您的 .htaccess 文件,无需其他任何内容即可将 wsgi 建立为处理程序。这将向 django.wsgi 和 django.wsgi/whatever 发出请求,并将其发送到您的 django 应用程序。

要使 URL 中的 django.wsgi 部分消失,您需要使用 mod_rewrite。希望您的主机已启用它。一个例子是

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ /django.wsgi/$1 [QSA,PT,L]

如果 URL 与文件匹配,它将提供该文件,如果不匹配,则由 django 提供服务。另一种选择是

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !^/?static/
RewriteRule ^(.*)$ /django.wsgi/$1 [QSA,PT,L]

要向/static/* 发出请求,请转到文件本身,并通过 django 处理其他所有内容。

然后您需要从生成的 URL 中隐藏 django.wsgi。这可以通过 django.wsgi 中的这样的代码片段来完成

def _application(environ, start_response):
    # The original application.
    ...

import posixpath

def application(environ, start_response):
    # Wrapper to set SCRIPT_NAME to actual mount point.
    environ['SCRIPT_NAME'] = posixpath.dirname(environ['SCRIPT_NAME'])
    if environ['SCRIPT_NAME'] == '/':
        environ['SCRIPT_NAME'] = ''
    return _application(environ, start_response)

如果结果不太正确,请务必咨询 http://code.google.com/p/modwsgi/wiki/ConfigurationGuidelines 。我从那里提取了答案的大部分细节,但只是一步一步地将正确的部分组合在一起。

关于python - 使用 apache 和 mod_wsgi 提供静态文件而不更改 apache 的配置?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3981267/

相关文章:

python - 我的 CSS 和图像没有显示 Django

python - 将列表传递给 render(request) 时 CSS 失败

apache - tomcat JndiRealm表单认证如何实现 "remember me"?

django - “select_for_update” 在原子 block 内调用仍然 TransactionManagementError

python - Django Rest 框架 HyperLinkedRelatedField : allow id instead of url for POSTS requests

python - 如何使 Django 管理 URL 仅供本地主机访问?

regex - .htaccess 文件我无法让它工作

python - 为什么 PostgreSQL 适配器 psycopg2 在 Google App Engine dev_appserver.py 中失败?

python - 添加文本作为标签时,插图(matplotlib)中的条形图有问题吗?

python - scipy 0.11.0 到 0.12.0 改变了线性 scipy.interpolate.interp1d,打破了我不断更新的插值器