Flask добавляет косую черту в конце URL-адреса, маршруты не совпадают

Судя по заголовку, 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

person arielCo    schedule 06.03.2018    source источник
comment
попробуйте добавить strict_slashes=False к маршруту   -  person noslenkwah    schedule 07.03.2018
comment
Возможный дубликат Конечная косая черта вызывает 404 в правиле пути Flask   -  person sytech    schedule 07.03.2018
comment
@noslenkwah, я уже пробовал это, но безуспешно - понятия не имею, почему.   -  person arielCo    schedule 07.03.2018
comment
@sytech, я уже просмотрел этот пост   -  person arielCo    schedule 07.03.2018
comment
Вы пробовали /foo/foo ? Похоже, что для вашего псевдонима сценария WSGI установлено значение /foo. Если это не сработает, попробуйте запустить приложение без Apache/WSGI и посмотрите, работает ли оно должным образом.   -  person sytech    schedule 07.03.2018
comment
@sytech: становится намного ближе - автономный сервер Flask принимает http:..:5000/foo, а Apache работает с http:..:9000/foo/foo, даже если strict_slashes=True. Но почему? Я обновлю вопрос.   -  person arielCo    schedule 07.03.2018


Ответы (3)


Ваш WSGIScriptAlias ​​настроен неправильно. Ваше приложение обслуживается Apache относительно /foo

Чтобы получить желаемое поведение, псевдоним должен быть для корневого каталога, т.е. / вместо /foo

person sytech    schedule 07.03.2018
comment
WSGIScriptAlias / /var/... работает. Большое спасибо! Чтобы он сосуществовал с другими псевдонимами сценариев (например, /hello в моем Apache .conf), я сохраняю псевдоним и украшаю его route('/'), route('/tweedledee'), route('/tweedledum'). - person arielCo; 07.03.2018

Вы должны использовать только один декоратор между

@app.route('/foo')
@app.route('/foo/')

Второй декоратор также вызывает перенаправление с завершающей косой чертой.

person Giacomo Catenazzi    schedule 06.03.2018
comment
Это терпит неудачу с обоими декораторами или одним из них. - person arielCo; 07.03.2018
comment
Решив проблему (см. ответ sytech), я попытался добавить ненужный декоратор до и после полезного. Оба работают. Спасибо, что побудили меня протестировать. - person arielCo; 07.03.2018

Вам не нужно было указывать косую черту во втором декораторе, колба автоматически перенаправляется на этот контроллер, связанный с вашим URL-адресом.

Я также предлагаю вам удалить второй декоратор...

person SR_Mehta    schedule 07.03.2018