Python BaseHTTPRequestHandler иногда возвращает изображения, а иногда нет - PullRequest
0 голосов
/ 31 октября 2018

Итак, я создаю сервер изображений BaseHTTPRequestHandler в Python 3 и в функции do_GET обрабатываю запрос get следующим образом:

    if self.path.split('?')[0] == '/get/image':
        os.chdir("/var/www/Static/images")
        self._set_headers()
        for file in glob.glob("*welcome-image*"):
            f = open('/var/www/Static/images/' + file, 'rb')
            self.wfile.write(f.read())
            f.close

Если я затем перехожу по URL-адресу сервера, он обслуживает запрошенное изображение, но если я пытаюсь снова, я получаю 502 (я использую прокси-сервер Nginx, так что это дает мне 502), мне нужно подождать 15 секунд, чтобы получить успешный запрос на образ.

Странная вещь в том, что, если я удаляю оператор if, он работает и возвращает изображение каждый раз, когда я его запрашиваю. Кроме того, если я пытаюсь выполнить запрос, и он дает мне 502, похоже, что функция do_GET не запускается, потому что, если я печатаю некоторый текст поверх функции, он не печатает.

Вот весь сценарий:

from http.server import BaseHTTPRequestHandler, HTTPServer
import os, glob, base64, random, json, io, string, _thread
from urllib.parse import urlparse

def id_generator(size=6, chars=string.ascii_uppercase + string.digits):
    return ''.join(random.choice(chars) for _ in range(size))

activeRequests = []

class ImageServer(BaseHTTPRequestHandler):
    def _set_headers(self):
        self.send_response(200)
        self.send_header('Access-Control-Allow-Credentials', 'true')
        self.send_header('Access-Control-Allow-Origin', '*')
        self.send_header('Access-Control-Allow-Methods', 'GET, POST, OPTIONS')
        self.send_header("Access-Control-Allow-Headers", "X-Requested-With, Content-type")
        self.end_headers()


def do_HEAD(self):
    self._set_headers()

def do_OPTIONS(self):
    self._set_headers()

def do_GET(self):
    if self.path.split('?')[0] == '/get/image':
        os.chdir("/var/www/Static/images")
        self._set_headers()
        for file in glob.glob("*welcome-image*"):
            f = open('/var/www/Static/images/' + file, 'rb')
            self.wfile.write(f.read())
            f.close

def do_POST(self):
    self._set_headers()
    self.send_header('Content-type', 'text/html')

    content_length = int(self.headers['Content-Length'])
    body = self.rfile.read(content_length)
    post = json.loads(body.decode('utf8').replace("'", '"'))

    if self.path == '/upload/meta':
        data = {}
        data['response'] = "received"
        data['ID'] = id_generator()
        post['ID'] = data['ID']
        post['b64'] = [0] * post['chunks'];

        activeRequests.append(post)
        self.wfile.write(bytes(json.dumps(data), "utf8"))
    elif self.path == '/upload/image':
        info = {}
        for active in activeRequests:
            if(active['ID']) == post['ID']:
                info = active
                active['b64'][post['chunk_id']] = post['chunk']
                if post['chunk_id'] == active['chunks'] -1:
                    self.buildImage(info)
                self.wfile.write(bytes(json.dumps(post), "utf8"))
                break

def buildImage(self, b64_data):
    data = list(filter((0).__ne__, b64_data['b64']))
    imgdata = base64.b64decode(''.join(data).split(',')[1] + "==")
    cut = b64_data['name'].split('.');
    filename = b64_data['hash'] + '?' + cut[0] + '?' + b64_data['for'] + '.' + cut[1]
    with open('/var/www/Static/images/' + filename, 'wb') as f:
        image = f.write(imgdata)

    print('Image Uploaded')

if __name__ == "__main__":
    print('starting server...')
    server_address = ('localhost', 1337)
    httpd = HTTPServer(server_address, ImageServer)

    print('server is running!');
    httpd.serve_forever()
...