title: Python - BaseHTTPServer , issue with POST and GET
body: <p>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.</p>
  
  <p>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:</p>
  
  <pre><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 += "&lt;html&gt;&lt;body&gt;&lt;a href='/restaurants/new'&gt;Add A New Restaurant&lt;/a&gt;"
                  output += "&lt;/br&gt;&lt;/br&gt;"
  
                  for restaurant in restaurants:
                      output += restaurant.name
                      output += """&lt;div&gt;
                              &lt;a href='#'&gt;Edit&lt;/a&gt;
                              &lt;a href='#'&gt;Delete&lt;/a&gt;
                              &lt;/div&gt;"""
                      output += "&lt;/br&gt;&lt;/br&gt;"
                  output += "&lt;/body&gt;&lt;/html&gt;"
  
                  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 += "&lt;html&gt;&lt;body&gt;"
                  output += "&lt;h1&gt;Add New Restaurant&lt;/h1&gt;"
  
                  output += "&lt;form method='POST' enctype='multipart/form-data action='/restaurants/new'&gt;"
                  output += "&lt;input name='newRestaurant' type='text' placeholder='New Restaurant Name'&gt;"
                  output += "&lt;input name='Create' type='submit' label='Create'&gt;"
                  output += "&lt;/form&gt;&lt;/body&gt;&lt;/html&gt;"
  
                  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 &amp; 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()
  </code></pre>
  
  <p>for reference here is my database_setup file where i create the database:</p>
  
  <pre><code>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)
  </code></pre>
  
  <p>I can't figure out why i cannot add new restuarants</p>