2014年12月1日 星期一

Python 處理 generator所產生的Dictionary Result

在 Django 中,
當我們想將 python 透過 HappyBase scan function 取得的 HBase Table scan resualt,
呈現在網頁上時

Example: 'pytest' Table
RowKey    f:id
"John"    "a"
"Mary"   "b"
"Tom"    "c"

views.py (回傳 HBase scan result 給 detail.html)
...
connection = happybase.Connection('192.168.0.7')
connection.open()
table = connection.table('pytest')
result = table.scan(columns=['f:id'], filter="SingleColumnValueFilter('f', 'id', !=, 'binary:a')")
template = loader.get_template('app1/detail.html')
context = Context({'messages': result, })
return HttpResponse(template.render(context))
...

connection = happybase.Connection('192.168.0.7')
connection.open()
使用HappyHBase連結到HBase(實際上是連結到Zookeeper,尚不知為何不用設定zookeeper的Port)

table = connection.table('pytest')
result = table.scan(columns=['f:id'], filter="SingleColumnValueFilter('f', 'id', !=, 'binary:a')")
對HBase上的 "pytest" Table 做 scan,篩選出 'f:id'不等於"a" 的row,並只回傳row的 id那欄

template = loader.get_template('app1/detail.html')
context = Context({'messages': result, })
return HttpResponse(template.render(context))
將result回傳包成HttpResponse,並回傳給指定的html template

-----------------HTML 顯示方法 1 ---------------------
若直接在html中顯示值:
detail.html
{% for v in messages %}
    {{v}}
    <br>

{% endfor %}

會顯示
('Mary', {'f:id': 'b'})
('Tom', {'f:id': 'c'})

(X1,X2, ...) => python的 Tuple 型態
{a1:b1, a2:b2, ...} => python的 Dictionary型態(類似java的Map)
--------------------------------------------

----------------HTML 顯示方法 2 -------------------
但如果我們只需要呈現 rowkey以及 id的值 則必須

views.py中再加入

@register.filter
def get_item(dictionary, key):    
     return dictionary.get(key)

並且於 detail.html中加入

{% for k, v in messages %}  <-- k, v對應tuple中的兩個值
    {{ k }}
    {% for id in v %}
        {{ v | get_item:id }} <-- Dictionary type的只能用這種方式取值
    {% endfor %}
{% endfor %}

就會顯示
Mary  b
Tom   c
--------------------------------------------

沒有留言:

張貼留言