iT邦幫忙

2019 iT 邦幫忙鐵人賽

DAY 23
0
Modern Web

三十天全端學習:透過javascript(Onsen UI)、python(tornado)、非關聯式資料庫(mongoDB)完成全端學習,建置web app、mobile app。系列 第 23

三十天全端學習(javascript、python、mongoDB)---第二十三天: python tornado ---實例: 全端連線實戰 IV

第二十三天: python tornado ---實例: 全端連線實戰 IV

接續day22的內容,今日會陸續加入 前端網頁(js) <-> python(tornado) <-> mongoDB 黑修斯的調試方法,昨日深思,因為這些debug的過程,或說程式"調試密技",個人覺得非常值得一學,畢竟由黑修斯消化、整理放上來的文章,對於讀者來說,並無太大程式功力的幫助,簡單來說,看了黑修斯寫的文章,可以成功建立,可是如果沒有人給於指導,不就無法思考了?!
好像廢話有些多了,重點就是,希望大家可以深入理解程式設計。


前提概要

day22 實作兩個功能(查詢與新增)。


本文概要

接續day22的內容,並加入前端至後端的測試。

開始前,不免要說一下,每天關心的時事,最近很紅的python,線上課程(付費的、免費的)開枝散葉的大肆攻略版面,不管是深度學習、機器學習等,我認為這個時代阿,實作才是最重要的,你做了多少作品,比起你知道多少更重要,想要知道上網查一下就有了。重點是能不能解決問題吧


正文開始

程式碼放在 github

day22實作兩個功能,這兩個功能還有兩個地方沒有完善,第一個是對前端的溝通還沒有完成,第二個是python程式的封裝,接下來我們就朝這兩個方向出發。

1. 調試密技

這招學起來,日後無往不利。

程式碼放在 github -> day23/day23_ex1

下面程式碼,延續day22_ex2修改而成,我新增了 myfind 變數,並將其印出,要讓各位了解myfind 變數的物件。

#查詢資料的型態
myquery = {}  #要搜尋的資料 空白全部搜尋,填值搜尋特定值。
noquery = {"_id": 0}  #要排除的資料
myfind = mycol.find(myquery)
print(type(myfind))

你可以看到,印出的物件類別為: <class 'pymongo.cursor.Cursor'>

調試重點

使用原生python idle 開啟檔案,並輸入myfind,可以得到相同結果,如下圖:

思考時間:為什麼透過for 迴圈 可以印出內容,而使用變數去收,就會出現 <class 'pymongo.cursor.Cursor'>物件呢?

這邊設一變數xx 指定等於 list(myfind),並印出 xx,就可以完整資料解析了:

現在變數xx是list 型別,就可以使用list 方法調用,如下:

剩下的就是資料處理的事情了,該丟甚麼資料給前端,等等會實作

1. 封裝day22的實作的功能

類別的介紹與基礎實作,請參考這篇 張凱喬寫的 關於Python的類別(Class)...基本篇,黑修斯這邊不贅述。

這邊介紹,Atom快速建立class的方便性,直接輸入class 使用代碼補全,就可以快速建立:

我有寫個簡單測試python程式碼放在 github -> day23/day23_class_test

樣式快速建立後,直接輸入類別名稱,即可,會同時改三個地方,請見下圖:

封裝新增功能與查詢功能

程式碼放在 github -> day23/day23_ex2

我已經先封裝好,兩個功能在class myclass中,最終輸出結果如下圖:

下面程式碼是class myclass的內容:

class myclass():
    """docstring for myclass."""
    def __init__(self,mydb_Name,collection):
        #連接本地端mongoDB
        import pymongo
        myclient = pymongo.MongoClient("mongodb://localhost:27017/")
        #設mydb繼承myclient[mydb_Name]的屬性。
        self.mydb = myclient[mydb_Name]
        #你的collection名稱
        self.mycol = self.mydb[collection]

    def show_state(self):
        print("目前存在的DB有  ",myclient.list_database_names())
        print("目前存在的collection有  ",self.mydb.list_collection_names())

    def insert_data(self,data): #新增功能
        #實作:新增功能
        self.mydata = data
        self.mycol.insert_one(self.mydata)   #單筆插入資料指令
        print("資料單筆新增成功")

    def get_data(self, myquery = {}, noquery={"_id": 0}):  #獲得資料
        self.myquery = myquery  #要搜尋的資料 空白全部搜尋,填值搜尋特定值。
        self.noquery = noquery  #要排除的資料

        self.myfind = self.mycol.find(myquery)
        self.xx = list(self.myfind)
        return self.xx

透過下圖紅框中所示,我們主要調用就是用呼叫的方式:

就請各位讀者熟習,意思為要多多練習,這個時代不缺知道的人,只缺捲起袖子實作的人。

2. 實作:會員更新與會員刪除

程式碼放在 github -> day23/day23_test.py

可以參考我day14的文章,有說明如何建立。
另外我在github上,有放檔案day23_test.py,讓同學可以直接練習單功能實作:

一開始先來review一下,

day21提到大約需要四個步驟,如下:
第一步:會員查詢 查詢會員檔中會員是否存在,查詢user_id是否存在,存在才可以進行後續動作,不存在是否進行註冊?
第二步:會員新增 若會員存在 -> 進入第三步,不存在就新增,這邊實現會員新增的功能。
第三步:會員更新 異動檔資料的上傳完成,再將主檔更新儲存。
第四步:會員刪除 直接刪除會員資料。

第一步與第二步,我們已經實作並封裝完成,現在來實作第三步:

下圖,是我們目前的進度,現在我們要實作第三步,會遇到幾個問題?

先前我們提過,資料的無價性,前面我們是直接對主檔資料做更動,若是資料有遺失,那就不好了,因此我們實務上的設計,要考慮資料的安全性...等,重點資料先不要遺失,資料不能被竊取,但這邊不討論資料被竊取,先討論資料的穩定。

我們在類別的設計上,可以指定要儲存的資料集(collection),因此對於資料結構的配合,我們留到後面再討論,這邊先實作功能。

刪除與更新功能實作

程式碼放在 github -> day23/day23_ex3

下列為myclass 類別中新增的程式碼


    def delete_data(self, mydelete):  #實作:會員刪除
        self.mydelete = mydelete
        self.mycol.delete_one(self.mydelete)

    def updata(self, myquery, new_values):  #實作:會員更新
        self.myquery = myquery
        self.new_values = new_values
        self.mycol.update_one(self.myquery, self.new_values)

在主要設置區的程式碼

# 定義一個新的myclass物件為b
b = myclass(mydb_Name="day21", collection="main")

#刪除功能
mydelete = { "user_id": "A7654321" }
b.delete_data(mydelete)

#更新功能
updata_value = { "name": "黑修斯" }
new_data = { "$set": { "name": "嘿嘿嘿" } }
b.updata(updata_value, new_data)

import pprint

pprint.pprint(b.get_data())

但這些程式碼還不夠完成!!

小作業:為什麼不完整呢,前面的資料結構有說明,我們必須修改一些程式碼,讓功能新增引數,讓我們可以選擇collection(主檔、異動檔、會員檔)


小結

明天完善myclass,並開始由前端出發 <-> 後台python(tornado)。


上一篇
三十天全端學習(javascript、python、mongoDB)---第二十二天: python tornado ---實例: 全端連線實戰 III
下一篇
三十天全端學習(javascript、python、mongoDB)---第二十四天: python tornado ---實例: 全端連線實戰 V
系列文
三十天全端學習:透過javascript(Onsen UI)、python(tornado)、非關聯式資料庫(mongoDB)完成全端學習,建置web app、mobile app。30

尚未有邦友留言

立即登入留言