2015-03-02 71 views
0

我正在使用2個網頁製作一個非常簡單的應用程序,網址爲localhost:8080/restaurants /和localhost:8080/restaurants/new。 我有一個sqlite數據庫,我用我的python代碼中的SQLAlchemy操作。Python - BaseHTTPServer,發佈POST和GET

在我的第一頁localhost:8080/restaurants /,這裏只包含我的數據庫中可用的餐館列表。 我的第二頁localhost:8080 /餐館/新,是我有一個表格,以便一個新的餐廳,使其顯示在localhost:8080 /餐廳。 但是,每當我在localhost:8080/restaurants/new的表單上輸入一個新的餐廳名稱時,它將無法將我重定向到localhost:8080/restaurants /,以便向我展示新餐廳,而只是保持相同的網址鏈接本地主機:8080 /餐廳/新消息「沒有收到數據」。 下面是我的代碼:

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

我知道這是很久以前,但我想出了你的問題。 首先,您的do_GET函數中的enctype='multipart/form-data'部分在if self.path.endswith("/restaurants/new"):部分缺少最後一個單引號。其次,在if ctype == 'multipart/form-data':中拼寫錯誤'multipart'。希望可以幫助你或他人。