首页 > 解决方案 > 使用 CGI 部署烧瓶应用程序时找不到 URL 错误

问题描述

我正在尝试使用 CGI 在共享服务器 (hostgator) 上部署烧瓶应用程序,但是当我使用基本 URL (mysite.com/) 和所有其他 URL 时出现 URL not found 错误。我已经使用 python 2.7.8 和 Flask 0.12.4 在 public_html/ 文件夹中设置了一个虚拟环境(python 2.7.8 不支持更新版本的 flask,因为它们使用 SSLContext)。

我已经确定 .htaccess 文件和 cgi-bin/main.cgi 文件配置正确,方法是在 public_html/ 文件夹中编写一个小烧瓶 hello_world 应用程序,该应用程序可以工作并运行网站。我已经尝试检查 cpanel 上的错误日志,这些日志是空的,并且在文件系统中找不到任何其他有用的日志。我还将所有权限设置为 755,这是 hostgator 建议无济于事的。

我的文件系统是这样的:

public_html/
    flask_hello_world.py
    some .html files for testing
    cgi-bin/
        main.cgi
    server/
        app.py
        __init__.py
        views.py
        models.py (sqlalchemy models)
        static/
           some .html files

我的 .htaccess 文件:

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ /home4/MYSITE/public_html/cgi-bin/main.cgi/$1 [L]
Addhandler cgi-script .py .cgi

主.cgi:

#!/home4/MYSITE/public_html/venv/bin/python 
import sys
sys.path.insert(0, '/home4/MYSITE/public_html/venv/lib/python2.7/site-packages/')
sys.path.insert(1, '/home4/MYSITE/public_html/server/')
from wsgiref.handlers import CGIHandler
from app import app

class ProxyFix(object):
   def __init__(self, app):
      self.app = app

   def __call__(self, environ, start_response):
      environ['SERVER_NAME'] = ""
      environ['SERVER_PORT'] = "80"
      environ['REQUEST_METHOD'] = "GET"
      environ['SCRIPT_NAME'] = ""
      environ['QUERY_STRING'] = ""
      environ['SERVER_PROTOCOL'] = "HTTP/1.1"
      return self.app(environ, start_response)

if __name__ == '__main__':
  app.wsgi_app = ProxyFix(app.wsgi_app)
  CGIHandler().run(app)

当我将 main.cgi 更改为运行 flask_hello_world.py 时,它运行得很好。这是代码:

import flask
from flask import Flask
app = Flask(__name__)


@app.route('/')
def index():
return flask.send_from_directory('/home4/MYSITE/public_html/','index.html')


@app.route('/hello')
def hello():
    return flask.send_from_directory('/home4/MYSITE/public_html/','hello.html')

将我的主项目 .py 文件移动到 public_html 文件夹中并没有解决问题。下面是实际项目中的app.py 和init .py:

应用程序.py:

import os
basedir = os.path.abspath(os.path.dirname(__file__))
from flask import Flask
##other imports including sqlalchemy

app = Flask(__name__)
app.config["CACHE_TYPE"] = "null"
# sqlalchemy setup
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///' + os.path.join(basedir, 'database.db')
##some other configurations
db = SQLAlchemy(app)
migrate = Migrate(app, db)
# flask login setup
login_manager = LoginManager()
login_manager.login_view = "login_view"
login_manager.init_app(app)

初始化.py:

from app import app, db, login_manager
import models
import views

当我使用“python views.py”运行它时,我的views.py 没有导入错误,并且“/”的路径与hello world 应用程序相同。所以我认为 app.py、init .py 或者我的路由不在 app.py 文件中的事实存在问题。

标签: pythonflaskcgishared-hosting

解决方案


问题可能是视图未在 app.py 或 init.py 中导入,因此应用程序不知道。因此,CGI 脚本抛出了未找到的 URL。


推荐阅读