# 0217 會議記錄 ## Flask 小組 ### Regular expression 1. [講義](https://docs.google.com/presentation/d/15RqysT1RU1yTgTUcHo_4JErnRBUArnsm_66QnaGWmv4/edit#slide=id.p) 2. 實作 * 先輸入 `ipython3` (互動式直譯器),進到 python 使用畫面 * 使用Regular expression 前先 `import re` * 退出 `exit` 3. 結合 Flask & SQLite 實作 demo :::spoiler ```=python import sqlite3,re from flask import Flask,request,jsonify #------regular expession----# def check_platenum(car_data): find=0 condition=['[A-Z]{3}\-[0-9]{4}','[A-Z]{3}-[0-9]{3}','[A-Z]{2}-[0-9]{3}', '[0-9]{3}-[A-Z]{2}','[0-9]{2}-[A-Z]{2}','[0-9]{4}-[A-Z]{2}', '[0-9]{3}-[A-Z]{3}','[0-9][A-Z]{2}-[0-9]{3}','[A-Z]{2}-[0-9]{2}'] platenum=car_data["platenum"] for i in range(len(condition)): res=re.search(condition[i],str(platenum)) try: res.group() find=1 break except: find=0; return find #------------sqlite---------# def connect_db(): dbcon=sqlite3.connect('example.db') return dbcon def insert_db(car_data): dbcon=connect_db() cur=dbcon.cursor() if check_platenum(car_data)==1: cur.execute( "INSERT INTO plate(platenum, carcolor, cartype) VALUES(?, ? ,?)", (car_data['platenum'],car_data['carcolor'],car_data['cartype']) ) dbcon.commit() dbcon.close return db_message(1) else: return db_message(0) def show_db():#將所有的資料回傳 datas = [] try: dbcon = connect_db() dbcon.row_factory = sqlite3.Row cur = dbcon.cursor() cur.execute("SELECT * FROM plate") rows = cur.fetchall() for i in rows: data = {} data["platenum"] = i["platenum"] data["carcolor"] = i["carcolor"] data["cartype"] = i["cartype"] datas.append(data) except: datas = [] return datas def db_message(stasus):#response msg=[] de={} if stasus==1: de["State"]="1" de["Message"]="Insert data successfully" else: de["State"]="0" de["Message"]="Insert data failed,platenum type error" msg.append(de) return msg #------------flask----------# app=Flask(__name__) @app.route('/carapi/insert',methods=[ 'POST',]) def insert_data(): car_data=request.get_json() return jsonify(insert_db(car_data)) @app.route('/carapi/show',methods=['GET']) def show_data(): return jsonify(show_db()) if __name__ == '__main__': app.run(debug=True) ``` ::: ### Q&A * 什麼時候字串前要加 r, 什麼時候不必加? > 如果用 compile 時就要加 r > 如果使用 re.search("pattern", "string"),這種方法就不用加 r" " * 請預測下列程式執行結果 ( compile 沒有加 r ): ``` r = re.compile('(h)(i)') m = r.match('hi...').group() print(m) ``` > regex 的跳脫字元跟原本的不一樣,要避免衝突 > 用以下例子說明 : ``` python print(r'hello\nhello') print('------------') print('hello\nhello') ``` ```python import re regex1 = re.compile('\\^') regex2 = re.compile(r'\\^') string = '^' print(regex1.search(string)) print(regex2.search(string)) ``` [參考資料1](https://stackoverflow.com/questions/21104476/what-does-the-r-in-pythons-re-compiler-pattern-flags-mean) [參考資料2](https://www.pythontutorial.net/python-basics/python-raw-strings/) ## RESTful 小組 1. 一個物件通常有四種操作 : 新增、修改、刪除、搜尋 2. [車辨系統 api](https://hackmd.io/@OsEDv306SvaJ66Gf5whwYQ/HySnBnQTs) 3. 獲取軌跡 (透過事件ID) `URI : /api/tracks/<event_id>` : 想要獲取特定軌跡資料,可以透過 `id`獲取 4. body: 要新增軌跡資料的資訊加進去 5. response : 新增與搜尋結果為何 ### Q&A * 為什麼**獲取軌跡**和**新增軌跡**網址一樣,而其中差別是**GET**和**POST**,會不會造成其誤解? > 根據 RESTful 定義,網址透過簡白方式,可以使使用者易了解 api 網址的用處。 > 想要獲取軌跡的話,method 使用 GET ; 想要新增軌跡的話,method 改成 POST,就無需再寫一個新的網址。(網址太多使用起來不方便)同理,要刪除的話,method 改成 DELETE。 * 為什麼**分析軌跡**有兩個以上大括號 > `車型軌跡分析`,搜尋結果可能不只一個車牌號碼。 * 能否釐清一下, track 是指一張畫面,還是一串軌跡 (許多張畫面)? > track是指一張畫面 * 一張畫面叫「軌跡」很奇怪。要不要改名為 event ?一系列 event 串起來才叫 track. > 改成event應該沒問題 * 另外「搜尋軌跡」並不會產生新資料,為什麼你們用 POST而非 GET? > 若使用get不會使用body * 有分成兩派 : 其中一派 CRUD (CREATE、READ、UPDATE、DELETE)這四個功能應用四種不同method: CREATE->POST、READ->GET、UPDATE->PUT、DELETE->DELETE。討論好,後續風格一致。 * `Search` method 用 GET 即可。 ## SQLite 小組 1. [table](https://hackmd.io/BqIrB_86RcmVqime7aDDCg) 2. 改善參數、新增table ## 開會 ==下次開會時間 : 3/4(六) 14:00== * 進度 : 1. 先建一個雛形,做測試 2. Flask小組 : 列出有哪些 function -> 其他兩組有無需要分工 (2/28 前看可不可以) 3. SQLite 小組 : 使用現有的車辨系統撈一些測試資料出來 (2/28 測試時,需有足夠資料),建立資料庫和備用。 4. 請冠伶學姊創一個共用的group 5. 若study完,若該技術有意義,可以派各組報告,讓大家多學一點(ex, 今天的regex)。 6. RESTful 小組 : 思考可以用現在訂出來的的api做哪些測試,而這些測試是否可以自動化進行,效果較好。 ## 補充 * 警局給的東西有些網頁開啟有亂碼 * 處理方式 : 安裝 [Set Character Encoding](https://chrome.google.com/webstore/detail/set-character-encoding/bpojelgakakmcfmjfilgdlmhefphglae/related) * 到有亂碼的網頁中 : 右鍵選擇 `Set Character Encoding` -> `Unicode(UTF-8)` * 冠伶 : 共用的目錄在 `/home/OPEN`,就請 SQLite 小組建一下 table 囉 ~ 我將大家都 "developer" 這個群組,並將 /home/OPEN 的 group 設為 developer,並將權限設為 drwxrwxr-x。 * sudo groupadd "developer" * sudo usermod -a -G developer [username] * sudo chown :developer OPEN * sudo chmod 775 OPEN 以上是我為達成目的,而使用的 command。