【问题标题】:URL not found error when deploying flask app using CGI使用 CGI 部署烧瓶应用程序时找不到 URL 错误
【发布时间】: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


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-12-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-10-19
      • 2020-10-12
      • 2012-08-03
      • 2014-11-13
      相关资源
      最近更新 更多