python - Flask 向 URL 添加尾部斜线,没有路由匹配

标签 python flask mod-wsgi apache2.4

根据标题,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 中的尾部斜杠。

在我添加 404 处理程序之前,我在这里和 Reddit 上浏览了两打关于路由的帖子,现在我已经无计可施了。没有“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

最佳答案

您的 WSGIScriptAlias 配置错误。您的应用程序由 Apache 相对于 /foo

提供服务

要获得您想要的行为,别名应该是根目录,即 I.E. / 而不是 /foo

关于python - Flask 向 URL 添加尾部斜线,没有路由匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49140718/

相关文章:

python - 如何使用 PyQt 或 PySide 在系统托盘中显示一些文本而不是图标?

python - 将矩阵的某些列从 float 转换为 int

python-3.x - Flask 应用程序的主管通过 virtualenv 激活 Gunicorn

python - Django + apache & mod_wsgi : having to restart apache after changes

python - 抓取\蜘蛛防护

Python mod_wsgi 应用程序奇怪的行为

python - 在一个文件中编写整个 Flask 应用程序是一种不好的做法吗?

python - 从 GPU 核心/线程的角度理解 Theano 示例

python - Tornado : support multiple Applications when using multi-process?(注意:多个应用程序)

javascript - 在外部 javascript 文件中使用 Jinja2 模板引擎