Chinaunix首页 | 论坛 | 博客
  • 博客访问: 455884
  • 博文数量: 45
  • 博客积分: 2526
  • 博客等级: 少校
  • 技术积分: 478
  • 用 户 组: 普通用户
  • 注册时间: 2008-05-12 21:04
文章分类

全部博文(45)

文章存档

2014年(1)

2011年(1)

2010年(3)

2009年(22)

2008年(18)

我的朋友

分类: Python/Ruby

2009-08-01 11:46:42

为了学习GAE(google app engine), 我写了一个小例子.因为GAE使用了django,沿用了其网络框架中基本
概念MTV(Model-Template-view). 在例子中,我用的model数据来自taobao API, 可以参考上篇文章:
Try taobao open API in python

在上篇文章中,调用taobao API拿到了一些测试数据, 可以把这些数据保存在GAE的数据库中,然后在View上
显示出来. 把上个taobao的代码做了写修改,把返回的测试数据封装成一个list,每个list的元素就是一个
taobaoke product.

现在为数据建模: 通过定义将 Model 作为子类的类,应用程序可以定义数据模型。使用 Model
属性和 类实例,可以定义 Model 的属性. 一个taobao product的key有tile,nick等.

class TaobaoProduct(db.Model):
    title = db.StringProperty()
    nick = db.StringProperty()
    pic_url = db.LinkProperty()
    price = db.StringProperty()
    click_url = db.StringProperty()


model建立好之后,接着准备view. 这里面就要用到GAE的webapp. 这个框架是一个简单的网络应用程序
框架,可用来开发适用于 App Engine 的 Python 网络应用程序。webapp 可兼容 Python 网络应
用程序容器的 WSGI 标准。webapp 提供了一种简单的方式来开始开发适用于 App Engine 的应用程序。

application = webapp.WSGIApplication([('/', MainPage),
                                      ('.*',Error404)],
                                      debug=True)

wsgiref.handlers.CGIHandler().run(application)


上述代码把 网址路径映射到 类的与 WSGI 兼容的应用程序.就是说当访问
时候, 相对应的RequestHandler类的get方法就会返回. 这里的MainPage
和Error404就是基于webapp.RequestHandler的字类, 调用
self.response.out.write向CGI写HTML数据.

my_product_list数据来源于taobao.py. 拿到一个元素为hash的list. 这时候我们把这些数据存在
GAE的database中(通过model.put). 数据库建立好之后, 就需要通过template和View把数据表示
成HTML格式,这个过程template.render函数可以帮你完成.

class MainPage(webapp.RequestHandler):

    def get(self):

        self.response.out.write("")
        #self.response.headers['Content-Type'] = 'text/plain'
        self.response.out.write("

List all Taobao Products

")

        # get taobao product from OpenAPI
        # See taobao.py for more details
        data = taobao.get_taobao_data()
        my_product_list = taobao.dump_data(data)

        # Store data to databases
        for item in my_product_list:
            one_product = TaobaoProduct(tile=item['title'],
                                        nick=item['nick'],
                                        pic_url=item['pic_url'],
                                        price=item['price'],
                                        click_url=item['click_url'])
            # save this product
            one_product.put()
            #print "save" , one_product.title

        # get all products in database
        products = TaobaoProduct.all()
        html_data = template.render('table.html', {'product_list' : products})
        self.response.out.write(html_data )
        self.response.out.write(" ")



这里render相当的难理解, 参考GAE的源码和django, render的第一个参数就是temlate文件,第二个
参数是一个hash, 可以把template文件里面的数据结构和需要显示的数据关联起来.

from google.appengine.ext import webapp

def render(template_path, template_dict, debug=False):
  """Renders the template at the given path with the given dict of values.

  Example usage:
    render("
templates/index.html", {"name": "Bret", "values": [1, 2, 3]})

  Args:
    template_path: path to a Django template
    template_dict: dictionary of values to apply to the template
  "
""
  t = load(template_path, debug)
  return t.render(Context(template_dict))


在本例中, products表示所有TaobaoProduct object, 'product_list' 关键字就是在tempalte文
件中可以使用的变量. table.html文件如下, 显示了product的列表. 关于tempalte的语法,请参
考django的文档.

<ul>
{% for product in product_list %}
    <li>{{ product.title }}</li>
    <li>{{ product.nick }}</li>
    <li>{{ product.pic_url }}</li>
    <li>{{ product.price }}</li>
    <li>{{ product.click_url }}</li>
    <p></p>
{% endfor %}
</ul>


然后运行 ./dev_appserver.py ../helloworld/
运行结果如下:


APP目录helloworld打包下载:
文件:helloworld.zip
大小:3KB
下载:下载


阅读(3108) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~