Question: Modify rest_server.py to respond to requests for data from measurements.sqlite by communicating with the test file test.py. rest_server.py from http.server import HTTPServer, BaseHTTPRequestHandler import re

Modify rest_server.py to respond to requests for data from measurements.sqlite by communicating with the test file test.py.

rest_server.py

from http.server import HTTPServer, BaseHTTPRequestHandler import re from json import loads, dumps import json import logging from tickets import create_ticket from db_util import db_help class RestHandler(BaseHTTPRequestHandler): def send_error_message(self, message, status_code=412): self.send_response(status_code) self.send_header("content-type", "application/json") rt = json.dumps({'error': message}).encode() self.send_header('content-length', len(rt)) self.end_headers() self.wfile.write(rt) def get_data(self): if 'content-length' in self.headers: data = self.rfile.read(int(self.headers['content-length'])).decode() logging.info("data is " + data) return json.loads(data) else: logging.debug('no content length') return {} def send_data(self, rtdata): self.send_response(200) self.send_header("content-type", "application/json") rt = json.dumps(rtdata).encode() self.send_header('content-length', len(rt)) self.end_headers() self.wfile.write(rt) def do_GET(self): if re.fullmatch("/loan/(\\d+)", self.path): data = self.get_data() if 'ticket' in data: ticket = data['ticket'] else: ticket = None  if ticket: match = re.fullmatch("/loan/(\\d+)", self.path) loan_id = int(match.group(1)) logging.debug('loan id in single loan request ' + str(loan_id)) the_loan = db_help.get_loan_for_loan_id(loan_id) if the_loan: oid = db_help.get_owner_id_for_ticket(ticket) if oid == the_loan['owner']: self.send_data({'loan': the_loan}) else: self.send_error_message('owner of ticket not the same as owner of loan') else: self.send_error_message('no loan data found') else: self.send_error_message("ticket required for operation") else: self.send_error_message("Invalid path {}".format(self.path)) if __name__ == "__main__": server = HTTPServer(('',8080), RestHandler) server.serve_forever() 

test.py

import db_access_use_rest import db_utility_use_rest import unittest def filter_first(list, predicate): for x in list: if predicate(x): return x return None  class TestDbFunctions(unittest.TestCase): def testNumberAreas(self): areas = db_access_use_rest.get_all_areas() self.assertEqual(7, len(areas)) def testOneArea(self): areas = db_access_use_rest.get_all_areas() k = filter_first(areas, lambda r: r['area_id'] == 3) self.assertEqual('Kennesaw', k['name']) def testNumberOfLocations(self): locs = db_access_use_rest.get_locations_for_area(3) self.assertEqual(len(locs), 4) def testOneLocation(self): locs = db_access_use_rest.get_locations_for_area(3) m = filter_first(locs, lambda r: r['location_id'] == 18) self.assertEqual('Mall', m['name']) def testNumberOfMeasurements(self): meas = db_access_use_rest.get_measurements_for_location(18) self.assertEqual(10, len(meas)) def testOneMeasurement(self): meas = db_access_use_rest.get_measurements_for_location(18) m = filter_first(meas, lambda r: r['measurement_id'] == 1803) self.assertAlmostEqual(61.11457551359794, m['value'], delta=1e-10) def testNumberOfCategories(self): cats = db_access_use_rest.get_categories_for_area(3) self.assertEqual(1, len(cats)) def testOneCategory(self): cats = db_access_use_rest.get_categories_for_area(3) m = filter_first(cats, lambda r: r['category_id'] == 32) self.assertEqual('East', m['name']) def testAverageMeasurement(self): avg = db_utility_use_rest.get_average_measurements_for_area(3) self.assertAlmostEqual(61.77813528637446,avg, delta=1e-10) def testAverageMeasurementMissing(self): avg = db_utility_use_rest.get_average_measurements_for_area(7) self.assertEqual(None, avg) def testNumberOfLocations2(self): numLoc = db_utility_use_rest.number_of_locations_by_area(3) self.assertEqual(4, numLoc) # if __name__ == "__main__": # unittest.main() 

database: http://ksuweb.kennesaw.edu/~bsetzer/4720sp16/extra/examples/measures.sqlite

database details: http://ksuweb.kennesaw.edu/~bsetzer/4720sp16/nanoc/output/examples/measurements-example

The requests to the server should contain paths that invoke the server to respond with certain data.

Path Function
/area Get a list of all areas
/area/(\d+)/location Get all locations for the given area id
/location/(\d+)/measurement Get all the measurements for the given location id
/area/(\d+)/category Get all the categories to which the given area belongs
/area/(\d+)/average_measurement Get the average measurement for the given area
/area/(\d+)/number_locations Get the number of locations in the given area

Return a list of dictionaries, JSON encoded, for the first four requests.

Return numeric values, JSON encoded, for the last two requests in the table.

Step by Step Solution

There are 3 Steps involved in it

1 Expert Approved Answer
Step: 1 Unlock blur-text-image
Question Has Been Solved by an Expert!

Get step-by-step solutions from verified subject matter experts

Step: 2 Unlock
Step: 3 Unlock

Students Have Also Explored These Related Databases Questions!