diff --git a/calculator.py b/calculator.py
index a46affd..3b5e70d 100644
--- a/calculator.py
+++ b/calculator.py
@@ -1,57 +1,71 @@
-"""
-For your homework this week, you'll be creating a wsgi application of
-your own.
+# Stella Kim
+# Assignemt 4: WSGI Calculator
-You'll create an online calculator that can perform several operations.
+import traceback
-You'll need to support:
- * Addition
- * Subtractions
- * Multiplication
- * Division
+def home(*args):
+ """Returns homepage that explains how to perform calculations"""
-Your users should be able to send appropriate requests and get back
-proper responses. For example, if I open a browser to your wsgi
-application at `http://localhost:8080/multiple/3/5' then the response
-body in my browser should be `15`.
+ body = """
+
WSGI Calculator
+ Here's how to use this page...
-Consider the following URL/Response body pairs as tests:
+ This application allows you to add, subtract, multiply or divide two
+ numbers based on the user's URL input. The first part of the path
+ indicates the operand. The operand is followed by two numbers to solve
+ the operation.
+
+ Some examples are:
+
+ - http://localhost:8080/multiply/3/5 yields a result of 15
+ - http://localhost:8080/add/23/42 yields a result of 65
+ - http://localhost:8080/subtract/23/42 yields a result of -19
+ - http://localhost:8080/divide/22/11 yields a result of 2
+
+
+ """
+ return body
-```
- http://localhost:8080/multiply/3/5 => 15
- http://localhost:8080/add/23/42 => 65
- http://localhost:8080/subtract/23/42 => -19
- http://localhost:8080/divide/22/11 => 2
- http://localhost:8080/ => Here's how to use this page...
-```
-To submit your homework:
+def add(*args):
+ """Returns a STRING with the sum of the arguments"""
- * Fork this repository (Session03).
- * Edit this file to meet the homework requirements.
- * Your script should be runnable using `$ python calculator.py`
- * When the script is running, I should be able to view your
- application in my browser.
- * I should also be able to see a home page (http://localhost:8080/)
- that explains how to perform calculations.
- * Commit and push your changes to your fork.
- * Submit a link to your Session03 fork repository!
+ result = str(int(args[0]) + int(args[1]))
+ body = 'Your total is: {}'.format(result)
+ return(body + 'Back to the homepage
')
-"""
+def subtract(*args):
+ """Returns a STRING with the difference of the arguments"""
-def add(*args):
- """ Returns a STRING with the sum of the arguments """
+ result = str(int(args[0]) - int(args[1]))
+ body = 'Your total is: {}'.format(result)
+
+ return(body + 'Back to the homepage
')
+
+
+def multiply(*args):
+ """Returns a STRING with the product of the arguments"""
+
+ result = str(int(args[0]) * int(args[1]))
+ body = 'Your total is: {}'.format(result)
- # TODO: Fill sum with the correct value, based on the
- # args provided.
- sum = "0"
+ return(body + 'Back to the homepage
')
- return sum
-# TODO: Add functions for handling more arithmetic operations.
+def divide(*args):
+ """Returns a STRING with the quotient of the arguments"""
+
+ try:
+ result = str(int(args[0]) / int(args[1]))
+ body = 'Your total is: {}'.format(result)
+ except ZeroDivisionError:
+ body = 'Error dividing by zero, please enter a non-zero value'
+
+ return(body + 'Back to the homepage
')
+
def resolve_path(path):
"""
@@ -59,26 +73,50 @@ def resolve_path(path):
arguments.
"""
- # TODO: Provide correct values for func and args. The
- # examples provide the correct *syntax*, but you should
- # determine the actual values of func and args using the
- # path.
- func = add
- args = ['25', '32']
+ funcs = {
+ '': home,
+ 'add': add,
+ 'subtract': subtract,
+ 'multiply': multiply,
+ 'divide': divide
+ }
+
+ path = path.strip('/').split('/')
+
+ func_name = path[0]
+ args = path[1:]
+
+ try:
+ func = funcs[func_name]
+ except KeyError:
+ raise NameError
return func, args
+
def application(environ, start_response):
- # TODO: Your application code from the book database
- # work here as well! Remember that your application must
- # invoke start_response(status, headers) and also return
- # the body of the response in BYTE encoding.
- #
- # TODO (bonus): Add error handling for a user attempting
- # to divide by zero.
- pass
+ headers = [('Content-type', 'text/html')]
+ try:
+ path = environ.get('PATH_INFO', None)
+ if path is None:
+ raise NameError
+ func, args = resolve_path(path)
+ body = func(*args)
+ status = '200 OK'
+ except NameError:
+ status = '404 Not Found'
+ body = 'Not Found
'
+ except Exception:
+ status = '500 Internal Server Error'
+ body = 'Internal Server Error
'
+ print(traceback.format_exc())
+ finally:
+ headers.append(('Content-length', str(len(body))))
+ start_response(status, headers)
+ return [body.encode('utf8')]
+
if __name__ == '__main__':
- # TODO: Insert the same boilerplate wsgiref simple
- # server creation that you used in the book database.
- pass
+ from wsgiref.simple_server import make_server
+ srv = make_server('localhost', 8080, application)
+ srv.serve_forever()