wsgiref

wsgiref 提供一些 web 开发的基础功能,最有用的就是提供了一个简单的开发服务器。

   1 import wsgiref
   2 def hello_app(environ, start_response):
   3     start_response('200 OK', [('Content-type','text/plain')])
   4     yield 'Hello world\n'
   5     for key, value in environ.items():
   6         yield '%s : %s\n' % (key, value)
   7 
   8 server = wsgiref.make_server('localhost', 8000, hello_app)
   9 server.serve_forever()

mako

mako 是一个模板引擎,通过将动态的数据填充到模板中,可以用来生成复杂的页面。

   1 from mako import Template
   2 tmpl = Template('./simple.html')
   3 print tmpl.render(data = {'a':1, 'b':2})

simple.html

<html>
  <head>
    <title>简单mako模板</title>
  </head>
  <body>
    <h5>Hello World!</h5>
    <ul>
      % for key, value in environ.items():
      <li>
        ${key} - ${value}
      <li>
      % endfor
    </ul>
  </body>
</html>

和 wsgiref 整合:

   1 import wsgiref
   2 from mako import Template
   3 def hello_app(environ, start_response):
   4     tmpl = Template('./simple.html')
   5     content = tmpl.render(data=environ)
   6     start_response('200 OK', [('Content-type','text/plain')])
   7     return [content]
   8 
   9 server = wsgiref.make_server('localhost', 8000, hello_app)
  10 server.serve_forever()

sqlalchemy

sqlalchemy 是一个 ORM,提供python对象与关系数据库之间的映射,通过 python 对象, 对关系数据库进行操纵。

model.py

   1 from sqlalchemy.ext.declarative import declarative_base
   2 
   3 engine = create_engine('sqlite:///data.db')
   4 Session = scoped_session(sessionmaker(autocommit=False, autoflush=False, bind=engine))
   5 Base = declarative_base()
   6 
   7 class Dictionay(Base):
   8     __tablename__ = 't_dictionay'
   9     key = Column('key', String(255), primary_key=True)
  10     value =  Column('value', String(255))
  11 
  12 # 创建数据库
  13 Base.metadata.create_all(engine)
  14 
  15 session = Session()
  16 for item in ['python','ruby','java']:
  17     dictionay = Dictionay(key=item, value=item.upper())
  18     session.add(dictionay)
  19 
  20 session.commit()
  21 
  22 for dictionay in session.query(Dictionary):
  23     print dictionay.name, dictionay.value

上面是个 demo,下面我们把它分解,并放到web应用中去。

model.py

   1 from sqlalchemy.ext.declarative import declarative_base
   2 
   3 engine = create_engine('sqlite:///data.db')
   4 Session = scoped_session(sessionmaker(autocommit=False, autoflush=False, bind=engine))
   5 Base = declarative_base()
   6 
   7 class Dictionay(Base):
   8     __tablename__ = 't_dictionay'
   9     key = Column('key', String(255), primary_key=True)
  10     value =  Column('value', String(255))

create_db.py

   1 from model import Base, Session, Dictionary
   2 
   3 # 创建数据库
   4 Base.metadata.create_all(engine)
   5 
   6 # 插入初始数据
   7 session = Session()
   8 for item in ['python','ruby','java']:
   9     dictionay = Dictionay(key=item, value=item.upper())
  10     session.add(dictionay)
  11 
  12 session.commit()

和 wsgiref 整合

   1 import wsgiref
   2 from mako import Template
   3 from model import Session, Dictionary
   4 def hello_app(environ, start_response):
   5     session = Session()
   6     dictionaries = session.Query(Dictionary)
   7     data = dict([(dictionary.name, dictionary.value) for dictionary in dictionaries])
   8 
   9     tmpl = Template('./simple.html')
  10     content = tmpl.render(data=data)
  11 
  12     start_response('200 OK', [('Content-type','text/plain')])
  13     return [content]
  14 
  15 server = wsgiref.make_server('localhost', 8000, hello_app)
  16 server.serve_forever()