# [後端概念] Curl/WSGI/MVC/MTV ###### tags: `後端` ## curl(CommandLine URL) >從字面上的意思就可以知道是在 Command Line 的環境下,**透過 HTTP 協定及利用 URL 規則進行資訊傳遞的工具,簡單來說就是可以透過它進行 request 及 response 的操作**,優點在於: > >1. 功能強大,任何網路相關的操作都可以透過 curl 進行。 >2. 只需要透過短短幾行指令就可以發送出 request,因此很適合拿來做測試使用。 >3. 支援檔案的上傳和下載。 * [[curl] 基本操作與指令 — 搭配 Lidemy HTTP Challenge 實作](https://miahsuwork.medium.com/curl-%E5%9F%BA%E6%9C%AC%E6%93%8D%E4%BD%9C%E8%88%87%E6%8C%87%E4%BB%A4-%E6%90%AD%E9%85%8D-lidemy-http-challenge-%E5%AF%A6%E4%BD%9C-39b79511eb9e) ## WSGI(Python Web Server GateWay Interface) >是一種**規範**,**規範 Web Server 和 Web Application(框架) 之間如何溝通**,**僅用於 Python 語言**。 ![](https://i.imgur.com/0fJzLDm.png) 1. 使用 Apache / Nginx 擇一做為反向代理伺服器:負責靜網頁與動態網頁請求和結果的回覆 2. 使用 gunicorn / uWSGI 擇一做為 WSGI 伺服器:負責接收代理伺服器的請求後,轉發給 Flask 以及接收 Flask 返回信息轉發給 Nginx 3. Flask 收到請求後處理數據並返回頁面給 uWSGI 伺服器。 **很多框架都自帶了 WSGI server** ,比如 **Flask**,webpy,**Django**、CherryPy等等。當然效能都不好,**自帶的 web server 更多的是測試用途**,釋出時則使用**生產環境的 WSGI server或者是聯合 nginx 做 uwsgi 。** * [【Flask教學系列】Flask 為甚麼需要 WSGI 與 Nginx](https://www.maxlist.xyz/2020/05/06/flask-wsgi-nginx/) ## MVC(Model-View-Controller) ### 1. Model: >常譯為「模型」,**負責和資料庫溝通**。 > >**放資料、與資料庫連動**的物件,會被稱為 Model 物件,由 Model 層來統一管理。 > >**和「商業邏輯」有關**,ex: 會員購物有九折、訂單超過一定的金額免運費 ### 2. View: >常譯為「視圖」,View 所管理的功能層叫作「表現層 (presentation layer)」,顧名思義是負責**管理畫面的呈現**,也就是 HTML 樣板 (template)。 > >在開發框架裡,因為 HTML template 會**有需要以動態顯示資料的情況 (也就是由 Model 取出的資料內容),所以 View 會再進一步運用樣板引擎 (template engine) 將資料帶入 template。** ### 3. Controller: >譯為「控制器」,它**掌握使用者互動邏輯,也是應用程式收發request/response 的核心。** > >MVC 架構的**中間人**,它 **決定了應用程式的工作流程 (workflow),並且蒐集不同元件的工作結果,統一回傳給使用者。** > >**來自路由的 request 會先被送到 Controller,再由 Controller 通知 Model 調度資料,並且把資料傳遞給 View 來產生樣板 (template),並將呈現資料的 HTML 頁面回傳給客戶端。** > Controller的情境,ex: * 使用者是否需要先登入 (認證) 才可以看到網頁內容? * 使用者是否只能閱讀資料,但不能修改或刪除? * 使用者新增了資料之後,會重新導向至哪個頁面? ### MVC v.s. MTV 1. Django框架使用的是MTV(Model-**Template**-View)架構模式。 2. 所謂的Template(樣板),將內容(content)從展現的視圖中分離開來 3. Django的**View決定呈現哪一個資料**,而View所指定的**Template則會描述"你如何看到、長什麼樣子"**。換句話說,Django的View和Template都是對應到MVC架構的View,都是關於資料顯示的部分。