确定确切路径,包括 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:/?
有没有办法确定向服务器请求的路径是什么,包括它是否包含问号?应用程序
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 发生这种情况。
这是一个与 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:/?