【发布时间】:2020-02-09 16:32:53
【问题描述】:
我正在尝试使用 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
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 应用程序相同时,我的views.py 没有导入错误。所以我认为 app.py、init.py 有问题,或者我的路由不在 app.py 文件中。
【问题讨论】:
标签: python flask cgi shared-hosting