Как передать параметр в метод GET-обработчика класса BaseHTTPRequestHandler в Python - PullRequest
0 голосов
/ 01 октября 2019

У меня есть HTTP-сервер в Python, созданный с

    from http.server import BaseHTTPRequestHandler, HTTPServer
    import bson.json_util
    import json
    server = HTTPServer((ip, port), GetHandler)
    print ('Starting server, use <Ctrl-C> to stop')
    server.serve_forever()

, где GetHandler

class GetHandler(BaseHTTPRequestHandler):
    def _set_headers(self):
        self.send_response(200)
        self.send_header('Content-type', 'application/json')
        self.end_headers()

    def do_GET(self):
        json_string = json.dumps({"message" : "Hello"}, default=bson.json_util.default)+"\n"
        self._set_headers()
        self.wfile.write(json_string.encode())#encoding='UTF-8'
        return

Предположим, я хочу передать переменную в метод do_GET классаGetHandler со строки server = HTTPServer((ip, port), GetHandler): как я могу это сделать?

РЕДАКТИРОВАТЬ

В качестве примера предположим, что у меня есть строка my_str, определенная перед строкой server = HTTPServer((ip, port), GetHandler), и я хочу использовать эту строку в качестве ответного сообщения.

1 Ответ

1 голос
/ 01 октября 2019

В Python вы можете создавать классы внутри функций. Затем эти классы получат доступ к локальным элементам функции через замыкание.

Следующий код определяет функцию make_handler, которая при вызове определяет новый класс "обработчик" со значением в myvariable, доступным внутривесь класс:

import json
from http.server import BaseHTTPRequestHandler, HTTPServer


def make_handler(myvariable):

    class GetHandler(BaseHTTPRequestHandler):
        def _set_headers(self):
            self.send_response(200)
            self.send_header('Content-type', 'text/plain')
            self.end_headers()

        def do_GET(self):
            self._set_headers()
            self.wfile.write(myvariable.encode('utf8'))
            return

    return GetHandler

server = HTTPServer(('127.0.0.1', 50002), make_handler('my_str'))
print ('Starting server, use <Ctrl-C> to stop')
server.serve_forever()
...