lundi 2 mars 2015

Python - BaseHTTPServer , issue with POST and GET

I am making a very simple application with 2 webpages at the moment under URLs: localhost:8080/restaurants/ and localhost:8080/restaurants/new. I have a sqlite database which i manipulate with SQLAlchemy in my python code.


On my first page localhost:8080/restaurants/, this just contains the lists of restaurants available in my database. My second page localhost:8080/restaurants/new, is where i have a form in order to a new restaurant such that it displays on localhost:8080/restaurants. However Whenever i enter a new restaurant name on form at localhost:8080/restaurants/new, it fails to redirect me back to localhost:8080/restaurants/ in order to show me the new restaurant, instead it just remains on the same url link localhost:8080/restaurants/new with the message "No data received" . Below is my code:



import cgi
from BaseHTTPServer import BaseHTTPRequestHandler, HTTPServer

#import libraries and modules
from sqlalchemy import create_engine
from sqlalchemy.orm import sessionmaker
from database_setup import Base, Restaurant, MenuItem

#create and connect to database
engine = create_engine('sqlite:///restaurantmenu.db')
Base.metadata.bind=engine
DBSession = sessionmaker(bind=engine)
session = DBSession()


class webServerHandler(BaseHTTPRequestHandler):
""" class defined in the main method"""

def do_GET(self):
try:
#look for url then ends with '/hello'
if self.path.endswith("/restaurants"):
self.send_response(200)

#indicate reply in form of html to the client
self.send_header('Content-type', 'text/html')

#indicates end of https headers in the response
self.end_headers()

#obtain all restaurant names from databse
restaurants = session.query(Restaurant).all()

output = ""
output += "<html><body><a href='/restaurants/new'>Add A New Restaurant</a>"
output += "</br></br>"

for restaurant in restaurants:
output += restaurant.name
output += """<div>
<a href='#'>Edit</a>
<a href='#'>Delete</a>
</div>"""
output += "</br></br>"
output += "</body></html>"

self.wfile.write(output)
print output
return


if self.path.endswith("/restaurants/new"):
self.send_response(200)
self.send_header('Content-type', 'text/html')
self.end_headers()

output = ""
output += "<html><body>"
output += "<h1>Add New Restaurant</h1>"

output += "<form method='POST' enctype='multipart/form-data action='/restaurants/new'>"
output += "<input name='newRestaurant' type='text' placeholder='New Restaurant Name'>"
output += "<input name='Create' type='submit' label='Create'>"
output += "</form></body></html>"

self.wfile.write(output)
return

except IOError:

self.send_error(404, "File %s not found" % self.path)



def do_POST(self):

try:
if self.path.endswith("/restaurants/new"):

ctype, pdict = cgi.parse_header(self.headers.getheader('content-type'))

#check of content-type is form
if ctype == 'mulitpart/form-data':

#collect all fields from form, fields is a dictionary
fields = cgi.parse_multipart(self.rfile, pdict)

#extract the name of the restaurant from the form
messagecontent = fields.get('newRestaurant')

#create the new object
newRestaurantName = Restaurant(name = messagecontent[0])
session.add(newRestaurantName)
session.commit()

self.send_response(301)
self.send_header('Content-type', 'text/html')
self.send_header('Location','/restaurants')
self.end_headers()

except:
pass




def main():
"""An instance of HTTPServer is created in the main method
HTTPServer is built off of a TCP server indicating the
transmission protocol
"""
try:
port = 8080

#server address is tuple & contains host and port number
#host is an empty string in this case
server = HTTPServer(('', port), webServerHandler)


print "Web server running on port %s" % port

#keep server continually listening until interrupt occurs
server.serve_forever()


except KeyboardInterrupt:
print "^C entered, stopping web server...."

#shut down server
server.socket.close()


#run main method
if __name__ == '__main__':
main()


for reference here is my database_setup file where i create the database:



import sys

#importing classes from sqlalchemy module
from sqlalchemy import Column, ForeignKey, Integer, String

#delcaritive_base , used in the configuration
# and class code, used when writing mapper
from sqlalchemy.ext.declarative import declarative_base

#relationship in order to create foreign key relationship
#used when writing the mapper
from sqlalchemy.orm import relationship

#create_engine to used in the configuration code at the
#end of the file
from sqlalchemy import create_engine


#this object will help set up when writing the class code
Base = declarative_base()



class Restaurant(Base):
"""
class Restaurant corresponds to restaurant table
in the database to be created.

table representation for restaurant which
is in the database
"""
__tablename__ = 'restaurant'


#column definitions for the restaurant table
id = Column(Integer, primary_key=True)
name = Column(String(250), nullable=False)



class MenuItem(Base):
"""
class MenuItem corresponds to restaurant table


table representation for menu_item which
is in the database
"""
__tablename__ = 'menu_item'

#column definitions for the restaurant table
name = Column(String(80), nullable=False)
id = Column(Integer, primary_key=True)
course = Column(String(250))
description = Column(String(250))
price = Column(String(8))
restaurant_id = Column(Integer, ForeignKey('restaurant.id'))
restaurant = relationship(Restaurant)



#create an instance of create_engine class
#and point to the database to be used
engine = create_engine(
'sqlite:///restaurantmenu.db')


#that will soon be added into the database. makes
#the engine
Base.metadata.create_all(engine)


I can't figure out why i cannot add new restuarants


Aucun commentaire:

Enregistrer un commentaire