Python использование веб-сервера в docker для ответа на почтовые запросы с моделью ML - PullRequest
0 голосов
/ 11 апреля 2020

Я пытаюсь принять запрос POST, проанализировать его, вызвать метод модели, чтобы получить прогноз на основе данных. И после этого верните прогноз или распечатайте на веб-сервере.

До сих пор я могу получить ответ POST с текстом, который я написал в файле json, который я даю (проверено с помощью Insomnia).

Docker Панель инструментов время от времени не позволяет мне запускать веб-сервер, но я не понимаю, какую ошибку я совершаю. Все необходимые библиотеки, которые я прошу предварительно установить в Dockerfile.

#!/usr/bin/python3
from http.server import BaseHTTPRequestHandler, HTTPServer
import socket
import subprocess
from io import BytesIO

from keras.models import Sequential
from keras.layers import Dense
import pandas as pd
import numpy as np
from urllib import request, parse

# HTTPRequestHandler class
class testHTTPServer_RequestHandler(BaseHTTPRequestHandler):

  # GET
    def do_GET(self):
        # Send response status code
        self.send_response(200)

        # Send headers
        self.send_header('Content-type','text/html')
        self.end_headers()
        self.wfile.write(b'Hello, world!')
        # Send message back to client
        message = "<font size=+3>Hello world!(HTML)</font><p>"
        self.wfile.write(bytes(message, "utf8"))

    def do_POST(self):
        content_length = int(self.headers['Content-Length']) #  Gets the size of data
        body = self.rfile.read(content_length)  # - Gets the data itself
        self.send_response(200)
        self.end_headers()
        response = BytesIO()
        response.write(b'wto proishodit????. ')
        response.write(b'This is POST request. ')
        response.write(b'Received: ')
        response.write(body)
        self.wfile.write(response.getvalue())

def run():
    print('starting server...')

   # Server settings
   # Choose port 8081, for port 80, which is normally used for a http server, you need root access
    server_address = ('', 8888)
    httpd = HTTPServer(server_address, testHTTPServer_RequestHandler)
    print('running server...')
    httpd.serve_forever()

class modelnn(object):
    """docstring"""

    def __init__(self,data):
        """Constructor"""
        self.data = data

  def get_result(self):
        train = pd.DataFrame([[0, 0, 1, 0],[1, 1, 1, 1], [1, 0, 1, 1], [0, 1, 1,0]])
        train.columns = ['ohe1', 'ohe2','ohe3', 'output']
        X_train = train[['ohe1', 'ohe2','ohe3']]
        y_train = train['output']

        batch_size = 2
        epochs = 6
        model = Sequential()
        model.add(Dense(3, activation = 'relu', input_shape=(3,)))  
        model.add(Dense(1, activation = 'sigmoid'))  
        model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])
        model.fit(X_train, y_train, batch_size=batch_size, epochs=epochs, verbose=0); 

        a = model.predict(self.data)
        b =np.apply_along_axis(lambda x: round(x[0]), 1, a )
        return b


X_test = pd.DataFrame([[0, 0, 1],[1, 1, 1], [1, 0, 1], [0, 1, 1],[1, 0, 0]])
X_test.columns = ['ohe1', 'ohe2','ohe3']
resultat = modelnn(X_test)
b = resultat.get_result() 


run()

Я пытался использовать json .loads (body) при пост-запросе для его анализа, но это не сработало.

Запрос ввода во вводе. json выглядит примерно так: '{"a": [2,2,2]}'.

Используя Docker Панель инструментов, я создаю image и затем запустите его:

docker build -t server .
docker run -t -p 8888:8888 server

Я полагаю, я что-то не так делаю с Docker или, может быть, я не получаю полностью логи c, поэтому любая помощь будет очень полезна. Спасибо!

https://github.com/dwfjwedk/webserver.git

1 Ответ

0 голосов
/ 12 апреля 2020

Проблема в основном была связана с неправильным использованием пробела и вкладок, а также текста для. json запроса.

#!/usr/bin/python3
from http.server import BaseHTTPRequestHandler, HTTPServer
from io import BytesIO
import json
from keras.models import Sequential
from keras.layers import Dense
import pandas as pd
import numpy as np


class testHTTPServer_RequestHandler(BaseHTTPRequestHandler):

    def do_GET(self):
        self.send_response(200)
        self.send_header('Content-type','text/html')
        self.end_headers()
        message = "<font size=+3>Hello world!</font><p>"
        self.wfile.write(bytes(message, "utf8"))

    def do_POST(self):
        content_length = int(self.headers['Content-Length']) 
        body = self.rfile.read(content_length)  
        self.send_response(200)
        self.end_headers()
        response = BytesIO()
        response.write(b'This is POST request.\n')
        response.write(b'Received as a test data: ')
        response.write(body)        
        response.write(b'\nPredicted by nn model:')
        X_test = pd.DataFrame(json.loads(body.decode('utf-8')).values())        
        resultat = modelnn(X_test)

        b = resultat.get_result()
        response.write(str(b).encode('UTF-8'))
        self.wfile.write(response.getvalue())

def run():
    print('starting server...')
    server_address = ('', 8000)
    httpd = HTTPServer(server_address, testHTTPServer_RequestHandler)
    print('running server...')
    httpd.serve_forever()

class modelnn(object):

    def __init__(self,data):
        self.data = data

    def get_result(self):
        train = pd.DataFrame([[0, 0, 1, 0],[1, 1, 1, 1], [1, 0, 1, 1], [0, 1, 1,0]])
        train.columns = ['ohe1', 'ohe2','ohe3', 'output']
        X_train = train[['ohe1', 'ohe2','ohe3']]
        y_train = train['output']

        batch_size = 2
        epochs = 6
        model = Sequential()
        model.add(Dense(3, activation = 'relu', input_shape=(3,)))  
        model.add(Dense(1, activation = 'sigmoid'))  
        model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])
        model.fit(X_train, y_train, batch_size=batch_size, epochs=epochs, verbose=0); 

        a = model.predict(self.data)
        b =np.apply_along_axis(lambda x: round(x[0]), 1, a )
        return b

run()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...