确定确切路径,包括 Flask + gevent.pywsgi WSGIServer 服务器上的尾随问号 presence/absence

Determine exact path, including presence/absence of trailing question mark on Flask + gevent.pywsgi WSGIServer server

有没有办法确定向服务器请求的路径是什么,包括它是否包含问号?应用程序

from gevent import monkey
monkey.patch_all()

import gevent
from gevent.pywsgi import WSGIServer
from flask import Flask, Response, request

def root():
    return Response(
        f'full_path:{request.full_path} '
        f'path:{request.path} '
        f'query_string:{request.query_string} '
        f'url:{request.url}'
    )

app = Flask('app')
app.add_url_rule('/', view_func=root)

server = WSGIServer(('0.0.0.0', 8081), app)
server.serve_forever()

总是

full_path:/? path:/ query_string:b'' url:http://localhost:8081/

如果请求

http://localhost:8081/?

http://localhost:8081/

这在很多情况下似乎并不重要,但我正在使用多个重定向进行身份验证流程,其中用户应该以与开始时完全相同的方式结束 URL。目前,我看不到一种方法可以确保 Flask + gevent WSGIServer 发生这种情况。


这是一个与 , but 类似的问题,当使用 gevent.pywsgi 中的 WSGIServer 时似乎不适用,因为 request.environ 没有这两个键RAW_URI 也不 REQUEST_URI

有一种方法是定义自定义 handler_class / WSGIHandler 并将 self.path 添加到 request.environ

from gevent import monkey
monkey.patch_all()

import gevent
from gevent.pywsgi import WSGIHandler, WSGIServer
from flask import Flask, Response, request

def root():
    return Response(
        f'request_line_path:{request.environ["REQUEST_LINE_PATH"]}'
    )

class RequestLinePathHandler(WSGIHandler):
    def get_environ(self):
        return {
            **super().get_environ(),
            'REQUEST_LINE_PATH': self.path,
        }

app = Flask('app')
app.add_url_rule('/', view_func=root)

server = WSGIServer(('0.0.0.0', 8081), app, handler_class=RequestLinePathHandler)
server.serve_forever()

所以对 http://localhost:8081/ 的请求输出

request_line_path:/

http://localhost:8081/? 的请求输出

request_line_path:/?