我最近偶然发现了一个问题,即使我解决了这个问题,我也想听听你对什么是正确的/简单的/采用的解决办法的看法。
我正在用Django + python开发网站。当我使用"python“在本地机器上运行它时,默认情况下本地地址是manage.py。
但是,在生产服务器上,我的应用程序还有其他url,带有路径类的"http://server.name/myproj/“。
我需要生成和使用永久的urls。如果我使用{% url视图参数%},我将获得相对于/的路径,因为我的urls.py包含以下内容
urlpatterns = patterns('',
(r'^(\d+)?$', 'myproj.myapp.views.index'),
(r'^img/(.*)$', 'django.views.static.serve', {'document_root': settings.MEDIA_ROOT + '/img' }),
(r'^css/(.*)$', 'django.views.static.serve', {'document_root': settings.MEDIA_ROOT + '/css' }),
)到目前为止,我发现了两种解决方案:
request.build_absolute_uri()在views.py中创建链接,或者在模板中传递一些带有'hostname:port/path’的变量
有没有更好的方法来处理这个问题?谢谢。
更新:问题似乎不是在django,而是在配置的Well方式上。带有URL "hostname.com/myapp“的应用程序的Apache配置包含以下行
WSGIScriptAlias / /home/dreamiurg/webapps/pinfont/myproject.wsgi因此,SCRIPT_NAME是空的,我看到的唯一解决方案是访问mod_python或从根提供应用程序。有什么想法吗?
发布于 2010-04-28 12:43:49
你不需要做什么特别的事。Django授予SCRIPT_NAME环境变量,这个变量是由mod_wsgi设置的,当您服务一个Django站点时,这个变量不是从根目录中设置的,而是自动地将其添加到url反向代码。
如果您使用的是mod_python (不应该使用),您可能需要在您的Apache配置中设置django.root。
更新了,我怀疑这是因为Web派系通过Apache的代理实例为Django站点提供服务的方式--这个实例不知道实际的挂载点,这是由Web派系的控制面板确定的。
在这种情况下,您可能需要在SCRIPT_NAME脚本中手动设置.wsgi。我认为这应该是可行的:
_application = django.core.handlers.wsgi.WSGIHandler()
def application(environ, start_response):
os.environ['SCRIPT_NAME'] = '/myproj/'
return _application(environ, start_response)发布于 2010-04-29 01:11:05
更改:
WSGIScriptAlias / /home/dreamiurg/webapps/pinfont/myproject.wsgi至:
WSGIScriptAlias /myproj /home/dreamiurg/webapps/pinfont/myproject.wsgi然后将WebFaction的nginx前端配置更改为后端的“/myproj”,而不是“/”。
这应该是所需的一切。您不应该在urls.py中使用'/myproj‘前缀。
换句话说,只需确保后端的安装点与安装在前端的位置相同。
修改WSGI脚本文件可以伪造SCRIPT_NAME,尽管它可能工作,但通常不建议允许Apache/mod_wsgi做正确的事情,这可能会有其他影响。
https://stackoverflow.com/questions/2729368
复制相似问题