在不更改Apache配置的情况下,用Apache和mod_wsgi提供静态文件?
我有一个Django应用程序,正在使用共享服务器托管,所以我不能更改apache的配置文件。我能做的只有修改我应用程序里的.htaccess文件。我还有一个标准的django.wsgi Python文件,作为入口点。
在开发环境中,我是用Django来提供静态文件的,但官方文档不建议这样做,建议应该通过网络服务器来处理这些文件。
有没有办法在不访问Apache配置的情况下,仅通过修改.htaccess或django.wsgi文件来让Apache提供静态文件呢?
2 个回答
1
从一个不同的虚拟主机上提供静态文件。
2
第一步是只需在你的 .htaccess 文件中添加
AddHandler wsgi-script .wsgi
这行代码,别的什么都不用加,这样就能把 wsgi 设置为处理程序。这样,所有请求到 django.wsgi 和 django.wsgi/后面跟的内容都会转到你的 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 来处理。
接下来,你需要把 django.wsgi 从生成的 URL 中隐藏。这可以通过在你的 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。我大部分的细节都是从那里来的,只是把正确的部分整理成了一个步骤。