Вызов функции перенаправления из BaseHTTPRequestHandler

У меня есть класс, который расширяется от BaseHTTPRequestHandler:

class Handler(http.server.BaseHTTPRequestHandler):
def do_GET(self):
    # send headers
    self.send_response(200)
    self.send_header('Content-type', 'text/html; charset=utf-8')
    self.end_headers()
    if re.findall(r'^/favicon.ico$', self.path) \
        or re.findall(r'^/public/.*$', self.path):
        pass
    else:
        run = Router(self.path)
        data = run.run_action()
        print(data)
        self.wfile.write(data.encode())

def do_POST(self):
    length = int(self.headers.get('Content-length', 0))
    data = self.rfile.read(length).decode()
    message = clean(parse_qs(data))
    self.send_response(200)
    self.send_header('Content-type', 'text/html; charset=utf-8')
    self.end_headers()
    if re.findall(r'^/favicon.ico$', self.path) \
            or re.findall(r'^/public/.*$', self.path):
        pass
    else:
        run = Router(self.path, message)
        data = run.run_action()
        self.wfile.write(data.encode())

def redirect(self, url):
    self.send_response(302)
    self.send_header('Location', url)
    self.end_headers()

Я хочу создать функцию для перенаправления пользователя. Например, после отправки POST. Как я могу вызвать функцию перенаправления вне этого класса?

PS: я нашел решение с анализом входных данных. Я внес изменения в код следующим образом:

class Handler(http.server.BaseHTTPRequestHandler):
def send_headers(self, status, content_type, value):
    self.send_response(status)
    self.send_header(content_type, value)
    self.end_headers()

def do_GET(self):
    if re.findall(r'^/favicon.ico$', self.path) \
            or re.findall(r'^/public/.*$', self.path):
        pass
    else:
        run = Router(self.path)

        data = run.run_action()
        uri = re.findall(r"'Location': '([\/a-z0-9-]+)'", data)
        if bool(uri):
            self.redirect(uri[0])
            run = Router(uri[0])
            data = run.run_action()
            self.wfile.write(data.encode())
        else:
            self.send_headers(200, 'Content-type',
                              'text/html; charset=utf-8')
            self.wfile.write(data.encode())

def do_POST(self):
    length = int(self.headers.get('Content-length', 0))
    data = self.rfile.read(length).decode()
    message = clean(parse_qs(data))
    self.send_headers(200, 'Content-type', 'text/html; charset=utf-8')

    if re.findall(r'^/favicon.ico$', self.path) \
            or re.findall(r'^/public/.*$', self.path):
        pass
    else:
        run = Router(self.path, message)
        data = run.run_action()
        self.wfile.write(data.encode())

def redirect(self, url):
    self.send_headers(302, 'Location', url)

Функция перенаправления выглядит так:

def redirect(url):
   return "'Location': '{}'".format(url)

Решение работает, но, может быть, кто-то может предложить лучший способ?

Я нашел в Python Doc

Примечание. Сценарии CGI, выполняемые классом CGIHTTPRequestHandler, не могут выполнять перенаправления (код HTTP 302), поскольку код 200 (следует вывод сценария) отправляется до выполнения сценария CGI. Это исключает код состояния.

0 ответов

Другие вопросы по тегам