Python Django和FastCGI在浏览器中提供404,但在命令行上工作 总结

Python Django和FastCGI在浏览器中提供404,但在命令行上工作 总结,python,django,apache,.htaccess,fastcgi,Python,Django,Apache,.htaccess,Fastcgi,Django 1.6 Python 2.6 Apache 2.2.27 PostgreSQL 8.4.20 psycopg2 flup 通过命令行查看Django站点的FastCGI包装页似乎效果不错,但在通过浏览器查看我的站点时,我总是得到一个404:page Not Found。我做错了什么?我怀疑这与我的Apache设置有关 版本和设置 Django 1.8文档中说,从Django 1.7开始,fastcgi支持已被弃用,我不能使用mod_wsgi,所以我使用的是Django 1.6。Py

Django 1.6 Python 2.6 Apache 2.2.27 PostgreSQL 8.4.20 psycopg2 flup

通过命令行查看Django站点的FastCGI包装页似乎效果不错,但在通过浏览器查看我的站点时,我总是得到一个
404:page Not Found
。我做错了什么?我怀疑这与我的Apache设置有关

版本和设置 Django 1.8文档中说,从Django 1.7开始,fastcgi支持已被弃用,我不能使用
mod_wsgi
,所以我使用的是Django 1.6。Python2.7和更高版本不可用,因此我使用Python2.6。托管公司不会为我安装Python软件包,但我自己设法安装了flup和psycopg2。(请注意,我必须在Linux64机器上编译psycopg2并将其上载到服务器。)

Django、flup和psycopg2安装在
/home/account/public\u html/sitename/site packages/
中。我的Django站点位于
/home/account/public\u html/sitename/sitename/
中。在命令提示符下发出
set | grep-epython-edjango
,不会返回任何结果(即未设置PYTHON或DJANGO环境变量)

全部故事 我正在尝试在共享主机上设置Django。在任何人提出之前:不幸的是,
mod_wsgi
是不可能的

我按照这里的说明做了:最后得到了这个
/home/account/public\u html/.htaccess

AddHandler fastcgi-script .fcgi
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ sitename/site.fcgi/$1 [QSA,L]
这是
/home/account/public\u html/sitename/site.fcgi

#!/usr/bin/python
import sys, os

# Add a custom Python path.
sys.path.insert(0, "/home/account/public_html/sitename")
sys.path.insert(0, "/home/account/public_html/sitename/site-packages")

# Switch to the directory of your project. (Optional.)
os.chdir("/home/account/public_html/sitename")

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

# From Django
from django.core.servers.fastcgi import runfastcgi
runfastcgi(method="prefork", daemonize="false", debug="true")
当我做
cd/home/account/public_html/sitename//site.fcgi
,我得到:

WSGIServer: missing FastCGI param REQUEST_METHOD required by WSGI!
WSGIServer: missing FastCGI param SERVER_NAME required by WSGI!
WSGIServer: missing FastCGI param SERVER_PORT required by WSGI!
WSGIServer: missing FastCGI param SERVER_PROTOCOL required by WSGI!
Status: 200 OK
X-Frame-Options: SAMEORIGIN
Content-Type: text/html; charset=utf-8

<!DOCTYPE html>
<html>
<head>
...etc...
导航到
http://example.com/valid-page
还生成一个
404
,服务器错误:

[error] File does not exist: /home/account/public_html/sitename/site.fcgi/valid-page
我做错了什么?或者WSGI是如何工作的,这样我可以更好地调试它

我试过了
  • 使用HostGator方法访问
    site.fcgi
    ,方法是:

    # From Django
    #from django.core.servers.fastcgi import runfastcgi
    #runfastcgi(method="prefork", daemonize="false", debug="true")
    
    # From HostGator
    from flup.server.fcgi import WSGIServer
    from django.core.wsgi import get_wsgi_application
    WSGIServer(get_wsgi_application()).run()
    
    相同的结果:
    404
    。这是有意义的,因为手动遍历代码表明来自Django的
    代码只是来自HostGator的
    代码的包装

  • 使用
    .htaccess
    中的
    fcgid脚本
    处理程序,而不是
    fastcgi脚本

    #AddHandler fastcgi-script .fcgi
    AddHandler fcgid-script .fcgi
    
  • 使用我在另一个教程中找到的
    .htaccess
    中的
    RewriteCond

    #RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_URI} !(sitename/site.fcgi)
    RewriteRule ^(.*)$ sitename/site.fcgi/$1 [QSA,L]
    
  • 将WSGIURI作为命令提示符样式参数传递(注意空格而不是
    /
    ):

  • 确保设置了
    请求URI
    环境变量:

    SetEnv REQUEST_URI %{REQUEST_URI}
    
  • 甚至将
    site.fcgi
    制作成一个CGI脚本,只是为了看看我是否能够从命令提示符下重现运行
    site.fcgi
    的成功(可能不是一个永久解决方案):

    然后导航到
    http://example.com/sitename/site.fcgi

  • 上述变化都不起作用,其中几个变化的许多组合也不起作用。他们中的许多人返回了
    404:Page Not Found
    ,一些人返回了更明显的错误,而另一些人只是显示了
    site.fcgi
    的源代码

    编辑
  • 我与Arvixe和LunarPages共享主机的结果相同/相似。以上描述仅使用我的Arvixe帐户,因为我的LunarPages帐户没有SSH访问权限,因此更难调试

    我甚至愿意接受低成本的替代托管计划(例如,其他托管公司),这将使它能够工作。这只是一个个人网站,不会产生任何收入,因此我不想花费Arvixe和LunarPages要求的每月约20美元的专用主机来访问
    mod_wsgi


  • 提前感谢您的帮助或建议

    我遇到了同样的问题(已发布),最终确定这是由于我与bluehost订阅的共享主机帐户受到限制所致。我切换了一个dreamhost共享托管计划,很快就启动并运行了。

    我遇到了相同的问题(已发布),并最终确定这是由于我与bluehost订阅的共享托管帐户受到限制所致。我切换了一个dreamhost共享托管计划,很快就启动并运行了。

    很难模仿,你能保密ssh访问吗?至少您使用的是什么共享主机?很难模拟,您可以私自使用ssh访问吗?至少你使用什么共享主机?
    #RewriteRule ^(.*)$ sitename/site.fcgi/$1 [QSA,L]
    RewriteRule ^(.*)$ sitename/site.fcgi $1 [QSA,L]
    
    SetEnv REQUEST_URI %{REQUEST_URI}
    
    #AddHandler fastcgi-script .fcgi
    #RewriteEngine On
    #RewriteCond %{REQUEST_FILENAME} !-f
    #RewriteRule ^(.*)$ sitename/site.fcgi/$1 [QSA,L]
    Options -Indexes +ExecCGI
    AddHandler cgi-script .fcgi