关于python:Flask向URL添加尾部斜杠,没有路由匹配

Flask adds trailing slash to URL, no routes match

根据标题,Apache2.4似乎在URL后面附加了"/"(根据request.url的说法),flask的路由与之不匹配或不匹配。

(相关)文件结构

1
2
3
4
5
6
7
8
/var/www/wsgi
...
├── dizmo
│   └── __init__.py
├── foo.wsgi
├── hello1.wsgi
└── __pycache__
    └── adapter.cpython-35.pyc

foo.wsgi公司

1
2
3
4
import sys
import inspect
sys.path.append('/var/www/wsgi')
from dizmo import app as application

迪兹莫/uuu init_uuuuy

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
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

我的网站.conf

1
2
3
4
5
6
7
8
9
10
11
12
<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>

运行时:

1
2
curl http://127.0.0.1:9000/foo
http://127.0.0.1:9000/foo/: no route

注意EDOCX1中的尾随斜线(0)。

我在这里和Reddit上浏览了二十多个关于路线的帖子,然后添加了404处理程序,现在我已经无计可施了。没有"foo"目录,所以DirectorySlash甚至都不重要。

编辑:strict_slashes=False似乎没有改变任何东西,除了使用一个装饰器,/foo/foo/外。

编辑2:显然,Apache或mod wsgi在路径上玩把戏,/foo/foo不知何故起作用。Flask独立服务器按预期工作:

1
2
3
4
5
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

——

1
2
3
4
5
6
7
>>> 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


您的wsgiscriptAalias配置错误。与/foo相比,Apache正在为您的应用程序提供服务。

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


您不需要在第二个修饰符中指定斜线。烧瓶将自动重定向到与URL关联的控制器。

我也建议你把第二个装饰器移走…


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

第二个修饰符也会导致最后一个斜杠的重定向。