Развертывание приложения Flask с CGI

Я написал небольшое приложение с использованием флеш-фреймворка. Я пытаюсь провести это с помощью cgi. После документации я создал файл .cgi со следующим содержимым:

#!/usr/bin/python
from wsgiref.handlers import CGIHandler
from yourapplication import app

CGIHandler().run(app)

Запуск файла приводит к следующей ошибке:

...

Файл "/usr/lib/pymodules/python2.7/werkzeug/routing.py", строка 1075, в bind_to_environ     wsgi_server_name = environ.get('HTTP_HOST', environ ['SERVER_NAME'])
KeyError: "SERVER_NAME"
Статус: 500 Внутренняя ошибка сервера
Content-Type: text/plain
Content-Length: 59

В моем приложении я установил:

app.config['SERVER_NAME'] = 'localhost:5000'

Когда я запускаю приложение с сервером разработки Flask, он работает отлично. Как вы можете сказать, я очень новичок в этом материале, и у меня есть поиск других с подобными ошибками, но без везения. Вся помощь приветствуется.

Ответ 1

Я постараюсь показать, что я сделал, и это работает в Godaddy, разделяя учетную запись хоста:

В папке cgi-bin в папке MYSITE я добавил следующий файл cgi:

#!/home/USERNAME/.local/bin/python3
from wsgiref.handlers import CGIHandler

from sys import path
path.insert(0, '/home/USERNAME/public_html/MYSITE/')
from __init__ 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)

Как вы можете видеть файл инициализации в папке MYSITE есть приложение колба.

Самое главное, чтобы установить права доступа. Я установил 755 разрешений для этой папки, КАК ХОРОШО, КАК для папки "/home/USERNAME/.local/bin/python3" !! Помните, что системе необходимо это разрешение, чтобы открыть колбу.

Чтобы открыть cgi, у меня есть следующий файл .htaccess в папке MYSITE:

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteRule ^(.*)$ /home/USERNAME/public_html/MYSITE/cgi-bin/application.cgi/$1 [L]

Таким образом, он будет отображать файл cgi, когда кто-то заходит на вашу страницу.

Ответ 2

Этот вопрос три года, и он никогда не был отмечен как ответ. Если вы ищете довольно полное обсуждение того, как это сделать, см. Последнее сообщение, которое я нахожу, fooobar.com/questions/660846/.... Это должно сработать для вас.

Конечно, мкрихели имеет правильную идею; monostop не должен пытаться запустить файл cgi (пусть сервер сделает это в ответ на входящий HTTP-запрос).

Ответ 3

Это опубликовано как ответ, следующий за комментариями выше для полноты.

Как обсуждалось выше, скрипты cgi должны выполняться на каком-то сервере. Здесь абстракция из CGI 1.1 RFC:

Общий интерфейс шлюза (CGI) - это простой интерфейс для запуска внешние программы, программное обеспечение или шлюзы под информационным сервером в независимо от платформы. В настоящее время поддерживаемая информация серверами являются серверы HTTP.

Для переменных среды (которые отсутствовали и вызвали ошибку) см. сектуб 4.1 в RFC.