2014-10-27 2 views
0

Novice вопрос re. BaseHTTPRequestHandler и получение данных ...Как получить файлы через класс BaseHTTPRequestHandler Python?

Я использовал BaseHTTPRequestHandler для получения строк JSON, переданных в качестве данных в URI. Теперь мне нужно получить строки JSON и файлы ascii. Как я могу сказать, что получил данные JSON и отдельный плоский файл? Как получить доступ к данным в файле?

Что делать, если я получил несколько файлов?

BTW, я просто провел тест по телефону мой URI из Почтальон & увидеть следующие заголовки:

headers: Host: localhost:6081 

Content-Type: application/x-www-form-urlencoded 

User-Agent: python-requests/2.2.1 CPython/3.4.0 Linux/3.13.0-35-generic 

Accept: */* 

Accept-Encoding: gzip, deflate, compress 

Content-Length: 403 

спасибо!

Бен

+0

Судя по этим заголовкам, ваш клиент отправляет файлы. См. [Этот вопрос] (http://stackoverflow.com/questions/8659808/how-does-http-file-upload-work) для общего обзора работы загрузки файлов. (В вашем случае, поскольку вы используете JSON, а не www-form-urlencoded, детали будут немного отличаться, но это все равно будет MIME-многостраничным сообщением.) Итак, вам нужно исправить это, прежде чем беспокоиться о на стороне сервера. – abarnert

+0

В любом случае, 'BaseHTTPRequestHandler', особенно версия 2.x, делает это довольно неуклюжим. IIRC, «правильный» способ сделать это - вручную использовать материал MIME-parsing в пакете «email» для обработки тела, но есть хакерский способ сделать это, заменив «email.message.Message» на ' MessageClass' в вашем подклассе и с использованием атрибута 'headers', как если бы это был конверт. – abarnert

+0

На самом деле, выкапывая какой-то старый код, вам нужно передать обертку вокруг 'mail.message.Message', которая имеет конструктор, который действует как' mimetools.Message'. В принципе, он должен принять аргумент 'fp' и использовать его для подачи данных в свой суперкласс. Надеюсь, этого достаточно, чтобы вы начали? – abarnert

ответ

0

Ответ в библиотеке CGI. Обратитесь к следующему сообщению StackOverflow: Simple Python WebServer. Второй ответ на этом посту был для нас наиболее полезен.

Вот некоторые тестовый код, который вы могли бы оказаться полезными для печати, что происходит за кулисами, особенно если вы пытаетесь получить несколько файлов в одном посте:

 print("command: " + self.command + "\npath: " + self.path + "\nrequest_version: " \ 
      + self.request_version + "\nheaders: " + str(self.headers)) 
     form = cgi.FieldStorage(
      fp=self.rfile, 
      headers=self.headers, 
      environ={'REQUEST_METHOD': 'POST', 
        'CONTENT_TYPE': self.headers['Content-Type'], 
        }) 
     print("\nform:", str(form)) 
     print("\nform['file'].filename:", form['file'].filename) 
     filename = form['file'].filename 
     data = form['file'].file.read() 
     open("/tmp/%s" % filename, "wb").write(data) 
     print('\ndata:', data) 

 Смежные вопросы

  • Нет связанных вопросов^_^