Flask向URL添加尾部斜杠,没有匹配的路由

时间:2018-03-06 22:01:11

标签: 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 / __初始化__。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上查了二十几个关于路线的帖子,现在我在我的智慧/绳索结束时。没有&#39; foo&#39;这样的目录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

3 个答案:

答案 0 :(得分:3)

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

提供

要获得所需的行为,别名应该是根目录,I.E。 /代替/foo

答案 1 :(得分:0)

你应该只在

之间使用一个装饰器
@app.route('/foo')
@app.route('/foo/')

第二个装饰器也会导致重定向带有最终斜杠。

答案 2 :(得分:0)

你不需要在第二个装饰器中指定斜杠,烧瓶会自动重定向到与你的网址相关联的控制器

我还建议你删除第二个装饰者......