2015-03-02 4 views
0

Я делаю очень простое приложение с 2 веб-страницами в настоящее время по URL-адресам: localhost: 8080/restaurants/и localhost: 8080/restaurants/new. У меня есть база данных sqlite, с которой я управляю SQLAlchemy в моем коде на языке python.Python - BaseHTTPServer, выпуск с POST и GET

На моей первой странице localhost: 8080/restaurants /, это просто содержит списки ресторанов, доступных в моей базе данных. Моя вторая страница localhost: 8080/restaurants/new, где у меня есть форма, чтобы новый ресторан, который он отображает на localhost: 8080/restaurants. Однако, когда я вхожу в новое название ресторана по форме на localhost: 8080/restaurants/new, он не перенаправляет меня обратно на localhost: 8080/restaurants /, чтобы показать мне новый ресторан, вместо этого он просто остается на одном и том же адресе link localhost: 8080/restaurants/new с сообщением «Нет данных». Ниже мой код:

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() 

для справки здесь мой файл database_setup, где я создать базу данных:

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) 

Я не могу понять, почему я не могу добавлять новые restuarants

ответ

0

I знаете, это было давно, но я понял вашу проблему. Во-первых, enctype='multipart/form-data' в вашей функции do_GET в разделе if self.path.endswith("/restaurants/new"): отсутствует финальная одинарная кавычка. Во-вторых, вы пропустили «multipart» в if ctype == 'multipart/form-data':. Надеюсь, что это поможет вам или другим.

Смежные вопросы