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.com
url_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()
).