from http.server import BaseHTTPRequestHandler, HTTPServer from views import get_all_animals from http.server import BaseHTTPRequestHandler, HTTPServer # Here's a class. It inherits from another class. # For now, think of a class as a container for functions that # work together for a common purpose. In this case, that # common purpose is to respond to HTTP requests from a client. class HandleRequests(BaseHTTPRequestHandler): # This is a Docstring it should be at the beginning of all classes and functions # It gives a description of the class or function """Controls the functionality of any GET, PUT, POST, DELETE requests to the server """ # Here's a class function def _set_headers(self, status): # Notice this Docstring also includes information about the arguments passed to the function """Sets the status code, Content-Type and Access-Control-Allow-Origin headers on the response Args: status (number): the status code to return to the front end """ self.send_response(status) self.send_header('Content-type', 'application/json') self.send_header('Access-Control-Allow-Origin', '*') self.end_headers() # Another method! This supports requests with the OPTIONS verb. def do_OPTIONS(self): """Sets the options headers """ self.send_response(200) self.send_header('Access-Control-Allow-Origin', '*') self.send_header('Access-Control-Allow-Methods', 'GET, POST, PUT, DELETE') self.send_header('Access-Control-Allow-Headers', 'X-Requested-With, Content-Type, Accept') self.end_headers() # Here's a method on the class that overrides the parent's method. # It handles any GET request. def do_GET(self): """Handles GET requests to the server """ # Set the response code to 'Ok' self._set_headers(200) # Your new console.log() that outputs to the terminal print(self.path) if self.path == "/animals": response = get_all_animals() # It's an if..else statement else: response = [] # This weird code sends a response back to the client self.wfile.write(f"{response}".encode()) # Here's a method on the class that overrides the parent's method. # It handles any POST request. def do_POST(self): """Handles POST requests to the server """ # Set response code to 'Created' self._set_headers(201) content_len = int(self.headers.get('content-length', 0)) post_body = self.rfile.read(content_len) response = f"received post request:
{post_body}" self.wfile.write(response.encode()) # Here's a method on the class that overrides the parent's method. # It handles any PUT request. def do_PUT(self): """Handles PUT requests to the server """ self.do_POST() # This function is not inside the class. It is the starting # point of this application. def main(): """Starts the server on port 8088 using the HandleRequests class """ host = '' port = 8088 HTTPServer((host, port), HandleRequests).serve_forever() if __name__ == "__main__": main()