使用CGI部署flask应用程序时找不到URL错误

时间:2019-10-12 10:36:49

标签: python flask cgi shared-hosting

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

我已经确定可以通过在工作并运行网站的public_html /文件夹中编写一个小的flask hello_world应用程序来正确配置.htaccess文件和cgi-bin / main.cgi文件。而且我尝试检查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

main.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:

app.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)

init.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文件中。

1 个答案:

答案 0 :(得分:0)

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