Skip to content

Completed Assignment 4: WSGI Calculator #26

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 1 commit into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
.vscode
144 changes: 80 additions & 64 deletions calculator.py
Original file line number Diff line number Diff line change
@@ -1,84 +1,100 @@
"""
For your homework this week, you'll be creating a wsgi application of
your own.
import traceback


def home():
page = '''
<h1>Welcome to gerardop's WSGI Calculator App<h1>
<h2>Addition</h2>
<p>To add two integers, visit the page http://localhost:8080/add/integer1/integer2, replacing integer1 and integer2 with the integers you wish to add.</p>
<p>Example: <a href="http://localhost:8080/add/26/21">http://localhost:8080/add/27/20</a></p>
<h2>Subtraction</h2>
<p>To subtract two integers, visit the page http://localhost:8080/subtract/integer1/integer2, replacing integer1 and integer2 with the integers you wish to subtract.</p>
<p>Example: <a href="http://localhost:8080/subtract/100/53">http://localhost:8080/subtract/100/53</a></p>
<h2>Multiplication</h2>
<p>To multiply two integers, visit the page http://localhost:8080/multiply/integer1/integer2, replacing integer1 and integer2 with the integers you wish to multiply.</p>
<p>Example: <a href="http://localhost:8080/multiply/11/15">http://localhost:8080/multiply/11/15</a></p>
<h2>Division</h2>
<p>To divide two integers, visit the page http://localhost:8080/divide/integer1/integer2, replacing integer1 and integer2 with the integers you wish to divide.</p>
<p>Example: <a href="http://localhost:8080/divide/235/5">http://localhost:8080/divide/235/5</a></p>
'''
return page

You'll create an online calculator that can perform several operations.

You'll need to support:

* Addition
* Subtractions
* Multiplication
* Division

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`.

Consider the following URL/Response body pairs as tests:

```
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/ => <html>Here's how to use this page...</html>
```

To submit your homework:

* 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!
def add(*args):
""" Returns a STRING with the sum of the arguments """
sum = str(int(args[0]) + int(args[1]))
return sum


"""
def subtract(*args):
""" Returns a STRING with the difference of the arguments """
difference = str(int(args[0]) - int(args[1]))
return difference


def add(*args):
""" Returns a STRING with the sum of the arguments """
def multiply(*args):
""" Returns a STRING with the product of the arguments """
product = str(int(args[0]) * int(args[1]))
return product

# TODO: Fill sum with the correct value, based on the
# args provided.
sum = "0"

return sum
def divide(*args):
""" Returns a STRING with the quotient of the arguments """
quotient = str(int(args[0]) / int(args[1]))
return quotient

# TODO: Add functions for handling more arithmetic operations.

def resolve_path(path):
"""
Should return two values: a callable and an iterable of
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 = '<h1>Not Found</h1>'
except ZeroDivisionError:
status = '400 Bad Request'
body = '''<h1>Bad Request</h1>
<p>Can't divide by 0</p>
'''
except Exception:
status = '500 Internal Server Error'
body = '<h1>Internal Server Error</h1>'
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()