pip install -r requirements.txt ставится, как родной. Причём, если запустить приложение из консоли на хостинге python app.py, то оно работает (приглашает перейти по 127.0.0.1:5000 ).curl 127.0.0.1:5000, то вижу код страницы (то есть всё работает). Но при переходе по домену — постоянно вижу Internal Server Error (500). В логах вот это:#!/usr/bin/python
# -*- coding: utf-8 -*-
import os
import sys
from wsgiref.handlers import CGIHandler
from run import app
sys.path.insert(0, os.path.dirname(__file__))
CGIHandler().run(app)# -*- coding: utf-8 -*-
from flask import Flask
app = Flask(__name__)
@app.route('/')
def hello_world():
return 'Hello, World!'
if __name__ == '__main__':
app.run()RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ /home/c/XXXXX/public_html/cgi-bin/app.cgi/$1 [L] #!/usr/bin/env python3
print("Content-Type: text/html\n")
print("<!doctype html><title>Hello</title><h2>hello world</h2>") $ ./app.cgi
Traceback (most recent call last):
File "./app.cgi", line 7, in <module>
from run import app
File "/home/c/XXXXX/public_html/cgi-bin/run.py", line 3, in <module>
from flask import Flask
ImportError: No module named 'flask' #!/home/c/XXXXX/public_html/cgi-bin/venv/lib/python3.4-bash: ./app.cgi: /home/c/XXXXX/public_html/cgi-bin/venv/lib/python3.4: bad interpreter: Permission denied #!/home/c/XXXXX/public_html/cgi-bin/venv/bin/python3.4/cgi-bin/app.cgi/, если в шаблоне ссылка создана через {{ url_for('page') }}?http://site.ru/cgi-bin/app.cgi/page и так http://site.ru/page — что совсем не гуд.RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ /home/c/XXXXX/public_html/cgi-bin/app.cgi/$1 [L] Disallow: /cgi-bin{{ url_for('page') }} в шаблоне ведёт на адрес http://site.ru/cgi-bin/app.cgi/page, что не очень хорошо (например, для добавления ссылки в закладки/соцсети, да и вообще). Redirect 301 /cgi-bin/app.cgi http://www.mysite.comurl_for() в шаблонах, чтобы работало по-человечески? url_for() функции? url_for() верно отображал ссылки, то и про обрезание думать и не пришлось бы, как раз Disallow бы помог. Откуда вообще url_for() берёт то, что нужно в каждый URL ещё дописывать папку, в котором CGI лежит и сам файл?! from werkzeug.contrib.fixers import CGIRootFix@app.route(), урле. Думала, что дело в моём коде — полностью скопипастила весь код с issue от Vikky Shostak, но ничего не поменялось./cgi-bin/ убралось, но /app.cgi/ всё равно осталось. url_for() неверно строит пути? url_for(). Спасибо!SERVER_NAME? Текущий адрес, типа site.ru:5000 или внутренний, типа 0.0.0.0:5000 или localhost:5000? Может тот, который в app.run(host='...') указан? app.config['SERVER_NAME'] = 'http://site.com/'_external, но ничего не поменялось./app.cgi/ всё так же добавляется.CGIRootFix (как мне указали на гитхабе) — не работает, а кейсов по его использованию не найти. Либо реально никто на шареде не запускает фласк, либо у всех работает фикс сразу же, без бубна... .htaccess тут не поможет никоим образом. Так как мы пытаемся лечить уже болезнь (добавление в ссылку CGI скрипта), хотя надо искоренять симптомы (построение ссылки через url_for()).