我正在尝试使用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文件中。
答案 0 :(得分:0)
问题可能是视图未导入到app.py或init.py中,因此应用程序未知。因此,CGI脚本抛出了找不到的URL。