Судя по заголовку, Apache 2.4, похоже, добавляет «/» к URL-адресу (согласно request.url
), а маршруты Flask не совпадают с ним или без него.
(соответствующая) файловая структура
/var/www/wsgi
...
├── dizmo
│ └── __init__.py
├── foo.wsgi
├── hello1.wsgi
└── __pycache__
└── adapter.cpython-35.pyc
foo.wsgi
import sys
import inspect
sys.path.append('/var/www/wsgi')
from dizmo import app as application
dizmo/__init__.py
from flask import Flask, request
import inspect
import sys
app = Flask(__name__)
app.debug = True
print( "app.config['SERVER_NAME']={}".format(app.config['SERVER_NAME']) )
print("{}:{} (outside)".format( inspect.currentframe().f_code.co_filename, inspect.currentframe().f_lineno ) )
@app.route('/foo')
@app.route('/foo/')
def tattletale():
return 'I\'m foo'
@app.errorhandler(404)
def err_handler_404(error):
return '{}: no route'.format(request.url), 404
mysite.conf
<VirtualHost *:9000>
<Directory /var/www/wsgi>
Require all granted
DirectorySlash Off
</Directory>
WSGIDaemonProcess CDRDB processes=2 threads=15 display-name=%{GROUP} python-path=/var/www/python-packages
WSGIProcessGroup CDRDB
WSGIScriptReloading On
WSGIScriptAlias /foo /var/www/wsgi/foo.wsgi
WSGIScriptAlias /hello1 /var/www/wsgi/hello1.wsgi
</VirtualHost>
Когда он работает:
curl http://127.0.0.1:9000/foo
http://127.0.0.1:9000/foo/: no route
Обратите внимание на косую черту в конце request.url
.
Я просмотрел два десятка сообщений здесь и на Reddit о маршрутах, прежде чем добавить обработчик 404, и теперь я на пределе своих возможностей. Там нет каталога «foo», поэтому DirectorySlash
не имеет значения.
Изменить: strict_slashes=False
, кажется, ничего не меняет, как и использование одного декоратора, /foo
или /foo/
.
Редактировать 2: очевидно, Apache или mod_wsgi шутят с путем, и /foo/foo
каким-то образом работает. Автономный сервер Flask работает как положено:
curl http://127.0.0.1:9000/foo/foo # Apache
I'm foo. route=http://127.0.0.1:9000/foo/foo
curl http://127.0.0.1:5000/foo # flask run
I'm foo. route=http://127.0.0.1:5000/foo
--
>>> flask.__version__
'0.12.2'
>>> sys.version_info
sys.version_info(major=3, minor=5, micro=2, releaselevel='final', serial=0)
$ apachectl -v
Server version: Apache/2.4.18 (Ubuntu)
Server built: 2017-09-18T15:09:02
strict_slashes=False
к маршруту - person noslenkwah   schedule 07.03.2018/foo/foo
? Похоже, что для вашего псевдонима сценария WSGI установлено значение/foo
. Если это не сработает, попробуйте запустить приложение без Apache/WSGI и посмотрите, работает ли оно должным образом. - person sytech   schedule 07.03.2018http:..:5000/foo
, а Apache работает сhttp:..:9000/foo/foo
, даже если strict_slashes=True. Но почему? Я обновлю вопрос. - person arielCo   schedule 07.03.2018