Итак, я создаю сервер изображений 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()