为什么在HostGator服务器上使用fcgi的Django表现出这种行为?

5
我将尝试在HostGator上部署一个简单的静态网站。我按照这个教程进行操作,并在我的.htaccess文件中(其中abc.com是网站)添加了以下内容:
AddHandler fcgid-script .fcgi
Options +FollowSymLinks
RewriteEngine On

RewriteRule (media/.*)$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(admin/.*)$ index.fcgi/$1 [L]
RewriteCond %{HTTP_HOST} ^abc\.com$ [OR]
RewriteCond %{HTTP_HOST} ^www\.abc\.com$
RewriteRule ^/?$ "http\:\/\/abc\.com\/index\.fcgi" [R=301,L]

但这并没有起作用,只会从我的模板目录加载“home.html”,而且原因不明。当我尝试跟随任何链接时,会出现hostgator 404错误页面。之后,经过一些研究和几次与hostgator支持人员的交谈,我将其更改为简单得多的:

AddHandler fcgid-script .fcgi

RewriteEngine On

RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ index.fcgi/$1 [QSA,L]

我在public_html目录下的index.fcgi文件如下:

#!/usr/local/bin/python
import sys, os, user
from django.core.servers.fastcgi import runfastcgi

sys.path.insert(0, "/usr/lib/python2.6")
sys.path.insert(0, "/home/joeshmo/django")
sys.path.insert(0, "/home/joeshmo/django/Projects")
sys.path.insert(0, "/home/joeshmo/django/Projects/PersonalWebsite")

# Switch to the directory of your project.
os.chdir("home/joeshmo/django/Projects/PersonalWebsite/")

# Set the DJANGO_SETTINGS_MODULE environment variable.
os.environ['DJANGO_SETTINGS_MODULE'] = "PersonalWebsite.settings"

runfastcgi(method="threaded", daemonize="false")

这个方法可以解决问题,但我非常好奇它是如何工作的。尽管我自己做了一些研究,但我对fcgi到底是什么以及它是如何告诉django从我的模板目录加载正确的html文件感到困惑。我跟HostGator技术人员交流后他们向我保证只能从public_html文件夹访问html文件。虽然我对url调度程序、正则表达式、视图等概念有所了解,但请记住我是一位自学成才的Web开发者。

1个回答

2
听起来你可能习惯于像PHP项目那样,URL和服务器上的路径之间存在一对一的对应关系。但在Django项目中不是这种情况:你将要请求的路径传递给一个脚本(通常是WSGI脚本,但在你的情况下是FCGI),该脚本知道将路径传递给Django代码。一旦路径到达Django代码,它会在urls.py文件中查找匹配的路径模式,并在找到匹配项时返回。问题路径在你的.htaccess文件中通过$1变量发送,这就是为什么当你传递字面字符串'home.html'而不是实际请求路径时,你只看到主页模板。

其他所有功能都正常吗?我曾经被迫通过FCGI在HostGator上托管Django项目,所以我知道设置它的痛苦。如果还有其他问题,我可能能够回忆起一些可怕的记忆,但我强烈建议查看Django-friendly host,如果你认为你可能会继续使用Django(我很满意WebFaction,他们提供安装程序,使得通过WSGI轻松设置Django更加容易)。


是的,这确实令人沮丧。我回复晚了的原因之一是因为我被迫停止工作,因为我快要疯了。我打算换主机。我一开始选择HostGator时太愚蠢了,没有做更多的研究,而且我已经厌倦了在StackOverflow上孤独地祈求答案的夜晚(尽管您的答案非常感激,我想增加对fcgi的了解也不会浪费)。 - ohhh
别担心,我当时也很困难,那个时候还有人在FastCGI上运行Django。那些日子已经过去了,现在很难找到支持,如果需要更多帮助,请回复此答案。 - Tom
嗨Tom,我刚刚在转移到Webfaction后关于静态文件管理又提了一个问题,如果你有任何建议,我将不胜感激:http://stackoverflow.com/questions/21170115/static-files-not-being-served-from-seperate-django-staticfile-application - ohhh

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接