2015年11月12日 星期四

Python學習筆記(二)....感動的JSON處理

雖然只是測試功能,但對 Python處理JSON字串留下深刻的印象,再度對Django框架有了更濃厚的興趣

建立django虛擬環境(virtualvenv):
ref - https://djangogirlstaipei.gitbooks.io/django-girls-taipei-tutorial/content/django/installation.html

我們可以直接開始安裝 Django,但實務上,大多數人都會搭配使用虛擬環境。使用虛擬環境有許多優點:
  • 你的專案會擁有一個專屬的獨立 Python 環境。
  • 不需要 root 權限,就可以安裝新套件。
  • 方便控管不同版本的套件,不用擔心升級套件會影響到其他專案。
  • 如果需要多人協作或在不同機器上跑同一個專案時,使用虛擬環境也可以確保環境一致性。



相關命令:
建立環境:python -m venv django_venv
切換至虛擬環境:django_venv\Scripts\activate

今天完成了字串轉 json object的處理,也對Django的了解更進一步;建立一個頁面,然後將新竹市政府opendata的資料,從json字串,轉換為 json object list,再轉到自己寫出來的頁面上

先看成果



過程與程式說明:
★資料來源:
新竹市政府開放資料平台提供了許多有趣的資料,其中一個是新竹市寺廟名冊

★步驟:
1. 在templates新增一個html,先將layout放入,再放入 layout.html 中挖空的部份(content),最後放入內容,在這邊僅僅把廟宇和主祀神像的名稱 show 出來
{% extends "app/layout.html" %}
{% block content %}
{% for god in gods %}
    {{god.temple}} : {{god.mastergod}}
{% endfor %}
{% endblock %}

2.在model要先定義JSON物件的類別,用來將傳回的資料物件化

class god(object):
    def __init__(self, temple, region, mastergod, type, organizationType, address, phone1, phone2):
        self.temple = temple
        self.region = region
        self.mastergod = mastergod
        self.type = type
        self.organizationType = organizationType
        self.address = address
        self.phone1 = phone1
        self.phone2 = phone2

3.在view中,則是要處理回傳資料的內容與產生god物件,再將之放到list中並回傳到template
import urllib.request
import json
import urllib
from urllib.request import Request
from app.models import god

def allMyGodsInHsinchu(request):
    assert isinstance(request, HttpRequest)
    req = Request("http://opendata.hccg.gov.tw/dataset/480911dd-6eea-4f97-a7e8-334b32cc8f6b/resource/ee12c072-e8aa-4be1-8179-f1c9606198f3/download/20150304091340575.json")
    try:
        response = urllib.request.urlopen(req)
        ur = response.readall().decode('utf-8-sig')
        j_obj = json.loads(ur) 
        templeLst = []
        for jsonObj in j_obj:
            g = god(jsonObj["寺廟名稱"],jsonObj["地區"],jsonObj["主祀神像"],jsonObj["教別"],jsonObj["組織型態"],jsonObj["寺廟所在地"],jsonObj["寺廟電話 1"],jsonObj["寺廟電話 2"])
            templeLst.append(g)
    except urllib.error.HTTPError as e:
        print(e.code)
        print(e.read().decode("utf-8-sig"))

    return render(request,
        'app/allmygods.html',
        context_instance = RequestContext(request,
        {
            'title':'求人不如求神',
            'gods':templeLst,
        }))



沒有留言: