Try   HackMD

0217 會議記錄

Flask 小組

Regular expression

  1. 講義
  2. 實作
    • 先輸入 ipython3 (互動式直譯器),進到 python 使用畫面
    • 使用Regular expression 前先 import re
    • 退出 exit
  3. 結合 Flask & SQLite 實作 demo
    ​​​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 的跳脫字元跟原本的不一樣,要避免衝突
    用以下例子說明 :

    ​​  print(r'hello\nhello')
    ​​  print('------------')
    ​​  print('hello\nhello')
    
    ​​  import re
    ​​  regex1 = re.compile('\\^')
    ​​  regex2 = re.compile(r'\\^')
    ​​  string = '^'
    ​​  print(regex1.search(string))
    ​​  print(regex2.search(string))
    
    參考資料1
    參考資料2

RESTful 小組

  1. 一個物件通常有四種操作 : 新增、修改、刪除、搜尋
  2. 車辨系統 api
  3. 獲取軌跡 (透過事件ID) URI : /api/tracks/<event_id> : 想要獲取特定軌跡資料,可以透過 id獲取
  4. body: 要新增軌跡資料的資訊加進去
  5. response : 新增與搜尋結果為何

Q&A

  • 為什麼獲取軌跡新增軌跡網址一樣,而其中差別是GETPOST,會不會造成其誤解?

    根據 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
  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
    • 到有亂碼的網頁中 : 右鍵選擇 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。