django Tutorial 筆記
筆記
- django自帶admin系統,可以很迅速產生針對資料庫的普通操作。在開發過程的測試中可以少下許多sql指令。上線後,也可以針對admin系統增加功能,省下開發後台管理介面的時間。等行有餘力再針對後台美化或製作自己想要的管理介面
- django中,application與app的差異:
- application:指的是整個web服務,包住整個網頁服務。需要外加什麼、設定什麼都由這份django application提供
- app:即底下的各服務、api…等。你隨時都可以因需求抽換細部功能。比如登入系統由vue框架轉成angular,開發完畢後抽換此區塊即可
- 根目錄下的manage.py是所有指令的起點,常用指令如下:
python manage.py runserver #啟動服務 python manage.py createsuperuser # 建立管理員帳號,可在/admin site登入 python manage.py makemigrate (APP名稱)# 產生本次要對DB做的事。尚未寫入db python manage.py sqlmigrate (APP名稱) 0001 # 產生SQL語法,若DBA有想要知道的話。並且會產生migration資料夾,存放本次作業的程式碼(用django提供對db操作的語法)。仍尚未真實寫入db python manage.py migrate #實際寫入DB python manage.py shll # 提供ipython terminal,便於一些測試。不過本來就有裝的話,就沒必要使用了
- setting.py,由名字可知所有基本設定都在這裡了;urls.py則是網頁的路徑;由於tutorial不會碰到wsgi.py,將在文後補充
- 開發前記得先修改時區,確保取到正確的時間
# 在setting.py中 TIME_ZONE = 'Asia/Taipei'
- 在urls增加網址,使用path傳遞。網路上其他文章或許可以看到使用url來傳遞,不過在django 2版後新增加path及re_path,url之後會廢棄掉。若是新學的話,就以path為主吧!根據網路資料來看,具體差異大概就是網址自帶的參數可以不必用正則來表達吧!且語法精簡化參考→stackoverflow/url vs path
url(r'^admin/', admin.site.urls) # deprecated,沒特殊原因的話就以path為主吧! path('polls/', include('polls.urls')) # 若手動把urls移動到polls的子目錄下如pyFile,須修改include的路徑 # 與Node.JS的express的路由不同,urls.py路徑用.來指定 path('polls/', include('polls.pyFile.urls'))
- django本身有提供一個template語法來渲染(render)html。不過我個人偏好用前端框架vue來開發,未細了解
- django 亦提供test case撰寫。要注意的是,test case的def名稱,前面一定要有test_
# 前面一定要有test_ def test_was_published_recently_with_future_question(self): pass
- django針對db操作,有提供自己的封裝,可以讓程式碼更簡潔。這個封裝稱為ORM。主要在後端抽換db時,可以不必重寫SQL指令。
- 開發RESTFUL API的話,須另外安裝django-rest-framework
- 開發完畢後要正式上線的話,可以參考官方check list避免一些安全性的問題!→Deployment checklist
補充 WSGI
全名:Web Server Gateway Interface(發音近似whisky)。是一個規範
WIKI上的解釋是:為Python語言定義的Web伺服器和Web應用程式或框架之間的一種簡單而通用的介面
簡單說就是中間件(middleware)
規範中,WEB被分為三類,即client,middleware, server
一個完整的資訊流如下:
client 發出request到middleware,由middleware指派給哪一server計算並產生結果,再取得靜態(static)檔案,再將整個response回傳給client
※wsgi這一塊還沒實際摸過,目前只是理論上的了解。如果有錯煩請糾正。
參考資料
如何理解 CGI, WSGI?
淺談cgi、wsgi、uwsgi 與 uWSGI的區別及應用
後記
如跟我一樣前端會採用框架來開發的話應該會馬上遇到:
django啟動時有一個port,框架啟動時也會有一個port!而這之間需要透過互丟資料時,就會遇到跨網域存取問題
解決方法請參考 →後端用django 前端用框架開發過程的跨域問題