Не меняется страница при смене request.uri, сервер на python

Имеется код:

class MyTCPHandler(StreamRequestHandler):

MAIN = open('main.html', 'rb')

REGISTRATION = open('reg.html', 'rb')

SIGN_IN = open('sign.html', 'rb')

CONTENT = open('content.html', 'rb')


def handle(self):
    request = Request(self.rfile)
    response = Response(self.wfile)
    to_json = ToJson()
    response.add_header('Content-Type', 'text/html')
    response.add_header('Connection', 'close')

    if request.uri == '/':
        response.set_file_body(self.MAIN)

    elif request.uri == '/registration':
        response.set_file_body(self.REGISTRATION)
        to_json.is_file()
        if request.method == 'POST':
            req_body = parse_qs(request.body.decode())
            if self.usr_check(req_body['login'], req_body['password'], 1, to_json.usr_list):
                response.body += '<h3>User already exists!</h3>'.encode()
                print(response.body)
            else:
                to_json.usr_list.append(req_body)
                to_json.write_file()
                request.uri = '/sign-in'
    
    elif request.uri == '/sign-in' :
        response.set_file_body(self.SIGN_IN)
        to_json.is_file()
        if request.method == 'POST':
            req_body = parse_qs(request.body.decode())
            for row in to_json.usr_list:
                if row == req_body:
                    request.uri = '/content'
                    return True
            else:
                response.body += '<p>Wrong login or password!</p>'.encode()

    print(request.uri)
    response.send()  

def usr_check(self, login, password, state, ls):
    for row in ls:
        match state:
            case 1:
                if login == row['login']:
                    return True
            case 2:
                if login == row['login'] and password == row['password']:
                    return True

Не могу понять(может я логику основную не так составил), почему после submit'a на странице '/registration', в браузере не меняется страница и урл остается таким же, хотя request.uri меняется, если выводить через консоль? Кто-нибудь может помочь разобраться с этим?


Ответы (1 шт):

Автор решения: Виталий

Пропущен метод response.send()внутри блока if request.method.

Вот как должно быть:

to_json.usr_list.append(req_body)
                    to_json.write_file()
                    request.uri = '/sign-in'
                    response.send()

Вот полный код:

class MyTCPHandler(StreamRequestHandler):

    MAIN = open('main.html', 'rb')
    REGISTRATION = open('reg.html', 'rb')
    SIGN_IN = open('sign.html', 'rb')
    CONTENT = open('content.html', 'rb')

    def handle(self):
        request = Request(self.rfile)
        response = Response(self.wfile)
        to_json = ToJson()
        response.add_header('Content-Type', 'text/html')
        response.add_header('Connection', 'close')

        if request.uri == '/':
            response.set_file_body(self.MAIN)
        
        elif request.uri == '/registration':
            response.set_file_body(self.REGISTRATION)
            to_json.is_file()
            if request.method == 'POST':
                req_body = parse_qs(request.body.decode())
                if self.usr_check(req_body['login'], req_body['password'], 1, to_json.usr_list):
                    response.body += '<h3>User already exists!</h3>'.encode()
                    print(response.body)
                else:
                    to_json.usr_list.append(req_body)
                    to_json.write_file()
                    request.uri = '/sign-in'
                    response.send()
        
        elif request.uri == '/sign-in':
            response.set_file_body(self.SIGN_IN)
            to_json.is_file()
            if request.method == 'POST':
                req_body = parse_qs(request.body.decode())
                for row in to_json.usr_list:
                    if row == req_body:
                        request.uri = '/content'
                        return True
                else:
                    response.body += '<p>Wrong login or password!</p>'.encode()
            
        print(request.uri)
        response.send()

    def usr_check(self, login, password, state, ls):
        for row in ls:
            match state:
                case 1:
                    if login == row['login']:
                        return True
                case 2:
                    if login == row['login'] and password == row['password']:
                        return True

Проверьте, пожалуйста, должно работать.

→ Ссылка