Как визуализировать часть тела BaseHTTPRequestHandler

Я пишу сервер на Python и хочу отправить некоторые данные в части тела GET-запроса. В настоящее время, когда я запускаю свой код, он просто зависает.

Я попытался поместить его в попытку / исключение и прочитать подробности о переменной экземпляра rfile, но я не нашел ничего полезного

Сторона клиента :

import http.client import sys import os #get http server ip http_server = sys.argv[1] #create a connection conn = http.client.HTTPConnection(http_server) while 1: cmd = input('input command (ex. GET index.html): ') cmd = cmd.split() f = open('data.txt') if cmd[0] == 'exit': #tipe exit to end it break #request command to server conn.request(cmd[0],'',f.read()) #get response from server rsp = conn.getresponse() #print server response and data print(rsp.status, rsp.reason) data_received = rsp.read() print(data_received) 

Серверная сторона:

 from http.server import BaseHTTPRequestHandler,HTTPServer import os class TestHTTPRequestHandler(BaseHTTPRequestHandler): def do_GET(self): a = '' fichier = open("data2.txt", "w") try: fichier.write(self.rfile.read()) except: self.send_response(200) self.send_header('Content-type','text-html') self.end_headers() return def run(): print('http server is starting...') server_address = ('127.0.0.1',80) httpd = HTTPServer(server_address, PancakeHTTPRequestHandler) print('htttp server is running...') httpd.serve_forever() if __name__ == '__main__': run() 

Я ожидаю, что смогу записать мои данные из моего запроса GET в мой файл data2.txt.

Спасибо за помощь

Всего 1 ответ


Он зависает из-за self.rfile.read() в вашем server.py. Метод read ожидает, что EOF или длина в байтах будут считаны. См. Https://docs.python.org/3/library/io.html#io.BufferedIOBase.read. Вы пытаетесь регистрировать клиентские запросы, сделанные на сервер, чтобы быстро обойти эту проблему, нужно передать длину содержимого. запрос метода read с помощью int(self.headers.get('Content-Length'))

В конце концов это дает нам:

client.py

import http.client
import sys  
import os

#get http server ip  
http_server = sys.argv[1]  
#create a connection  
conn = http.client.HTTPConnection(http_server)  

while 1:  
  cmd = input('input command (ex. GET index.html): ')  
  cmd = cmd.split()

  f = open('data.txt')

  if cmd[0] == 'exit': #tipe exit to end it  
    break  

  #request command to server  
  conn.request(cmd[0], '', f.read())  

  #get response from server  
  rsp = conn.getresponse()  

  #print server response and data  
  print(rsp.status, rsp.reason)  
  data_received = rsp.read()  
  print(data_received)  

server.py

from http.server import BaseHTTPRequestHandler,HTTPServer
import os

class TestHTTPRequestHandler(BaseHTTPRequestHandler):
    def do_GET(self):
        a = ''
        fichier = open("data2.txt", "a")
        try:
            content_length = int(self.headers.get('Content-Length'))
            response_str = self.rfile.read(content_length)
            fichier.write(response_str.decode('utf-8'))
            self.send_response(200)
            self.send_header("Content-type", "text/html")
            self.end_headers()
        except:
            self.send_response(200)
            self.send_header('Content-type','text-html')
            self.end_headers()
        fichier.close()
        return


def run():
    print('http server is starting...')
    server_address = (飗.0.0.1',80)
    httpd = HTTPServer(server_address, TestHTTPRequestHandler)
    print('htttp server is running...')
    httpd.serve_forever()

if __name__ == '__main__':
    run()  

пс. Я не знаю, что такое PancakeHTTPRequestHandler, поэтому я заменил его на TestHTTPRequestHandler. И я также добавил ответ в попытке, кроме как на стороне сервера, чтобы клиент получил ответ, в противном случае произойдет сбой.


Есть идеи?

10000