Вопрос:

Определите точный путь, включая наличие / отсутствие конечного вопросительного знака на сервере WSGIServer Flask + gevent.pywsgi

python http flask wsgi gevent

6 просмотра

1 ответ

20467 Репутация автора

Есть ли способ определить, какой путь был запрошен к серверу, в том числе, если он содержит вопросительный знак? Приложение

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.


Этот вопрос аналогичен запросу Flask: определите точный путь, в том числе, если есть вопросительный знак , но ответ, по-видимому, неприменим при использовании WSGIServerfrom gevent.pywsgi, поскольку не request.environимеет ни ключей, RAW_URIниREQUEST_URI

Автор: Michal Charemza Источник Размещён: 11.08.2019 07:21

Ответы (1)


0 плюса

20467 Репутация автора

Есть способ, определяя пользовательский 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:/?
Автор: Michal Charemza Размещён: 11.08.2019 07:44
Вопросы из категории :
32x32