python - 使用 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 文件中的事实存在问题。
解决方案
问题可能是视图未在 app.py 或 init.py 中导入,因此应用程序不知道。因此,CGI 脚本抛出了未找到的 URL。
推荐阅读
- python - 为什么处理许多 CSV 文件的代码在运行时会变慢?
- scroll - 如何在 Vue 3 Composition Api 中滚动时向导航栏添加和删除类
- android - 命令:flutter build apk -vv error FileSystemException: Cannot open file app.so errno = 2
- android-studio - 如何使 TextView 对象从变为不可见的 TextView 对象继承约束?
- javascript - 一些图片加载延迟 20 秒后无任何原因
- javascript - HTML 复制到剪贴板按钮不起作用
- kotlin - 收集内部流时取消协程
- c++ - 树突变和共享指针问题的访问者模式
- java - 有什么方法可以防止 Spring boot 在连接到 Kafka 时为 client-id 添加后缀?
- c - CS50 pset4 - 过滤器(不太舒服),棕褐色功能