1. 程式人生 > >Python+Flask+Gunicorn 專案實戰(一) 從零開始,寫一個Markdown解析器 —— 初體驗

Python+Flask+Gunicorn 專案實戰(一) 從零開始,寫一個Markdown解析器 —— 初體驗

 

 

 

(一)前言

在開始學習之前,你需要確保你對Python, JavaScript, HTML, Markdown語法有非常基礎的瞭解。專案的原始碼你可以在 https://github.com/zhu-y/markdown-toolkit 找到,最後的效果會像 http://yzhu.pythonanywhere.com 展示的一樣。在本專案中,我們將通過Python Flask實現後端,使用HTML/Javascript來實現前端,將前端使用者輸入的內容傳輸給後端,然後將後端返回的HTML樣式展示給使用者。

 


 

(二)環境配置

(1) 安裝Python(如果已有Python可忽略): 前往https://www.python.org/downloads/ 下載並且安裝。

(2) 安裝Flask(推薦使用虛擬環境): 

命令列輸入

$ pip install flask

(3) 新建專案資料夾,命名為markdown-toolkit用於存放整個專案,然後進入資料夾中準備開始下一步

$ mkdir markdown-toolkit
$ cd markdown-toolkit/

 


 

(三)開始搭建後端API

(1) REST APIs 基礎

如果我要做一個非常簡單的應用——留言板,需求是:當我釋出一個留言,其他人都可以看到我的留言;而我也可以看到其他人釋出的留言。

當我開啟這個應用的網頁,其實我會通過一個API介面從前端把一個檢視留言的請求發給後端,然後由後端去從資料庫裡找出儲存的留言記錄,然後返回給前端,顯示到我的頁面上。

當我想釋出一條留言的時候,我會通過另一個對應的API介面從前端把釋出留言的請求傳送給後端,然後由後端去把我的留言寫入資料庫。這樣當別人再去開啟這個頁面,他們就能看到我的留言了。

而我剛剛所講述的這個過程,實際上就是很多web應用最基礎的原型:(圖片參考自https://dzone.com/articles/an-introduction-to-restful-apis)

REST APIs的服務有幾個很大的特點:

a) 前後端分離

:client是前端(比如我們看到的網頁),server是後端(比如API介面),而他們是前後端分離的。

b) 無狀態的:server端不儲存任何資料。會話(session)儲存在client(前端),其他資料則大部分存放在資料庫。

c) 可快取的:客戶端一般可以將響應(response)儲存在快取中。這大大提高了API的效能。

 

在我們的即將要搭建的Markdown解析器專案中,我們暫時不需要用到資料庫。Python+Flask將承擔起我們後端的作用,而我們的前端將會由JavaScript+HTML完成.

 

(2) 準備工作

我們現在要建立我們的應用,我們可以叫它app。首先,在markdown-toolkit/資料夾中,新建run.py,插入以下程式碼,目的是架起我們的Flask應用:

#!flask/bin/python

from app import app
app.run(debug=True)

然後,在我們的專案資料夾 markdown-toolkit/ 中新建一個名為app的資料夾,並且進入這個資料夾:

$ mkdir app
$ cd app

然後在markdown-toolkit/app資料夾中新建名為templates的資料夾用於存放html頁面模板,static資料夾用於存放靜態檔案,在static資料夾中新建一個叫js的資料夾來存放JavaScript程式碼。

$ mkdir templates
$ mkdir static
$ mkdir static/js

在markdown-toolkit/app資料夾中,新建__init__.py,插入以下程式碼,目的是從我們的應用中呼叫我們即將新建的md2html.py這個檔案中的程式碼:

from flask import Flask

app = Flask(__name__)
from app import md2html

然後在markdown-toolkit/app資料夾中新建md2html.py,插入以下程式碼:

from app import app

@app.route('/')
def index():
    return "HELLO WORLD"

完成上述步驟後,我們專案資料夾的結構看起來應該是這樣的:

└── markdown-toolkit
    ├── app
    │   ├── __init__.py
    │   ├── md2html.py
    │   ├── static
    │   │   └── js
    │   └── templates
    └── run.py

這個時候,我們回到專案的資料夾markdown-toolkit中去,然後執行命令:

python run.py

我們會得到:

 * Serving Flask app "app" (lazy loading)
 * Environment: production
   WARNING: Do not use the development server in a production environment.
   Use a production WSGI server instead.
 * Debug mode: on
 * Running on http://127.0.0.1:5000/ (Press CTRL+C to quit)
 * Restarting with stat
 * Debugger is active!
 * Debugger PIN: 748-080-600

這就代表我們成功執行起了這個應用,這時用瀏覽器開啟http://127.0.0.1:5000/,我們就應該能夠看到這樣的一個畫面:

我們再來回顧我們寫在md2html.py這個檔案中的程式碼:

from app import app

@app.route('/')
def index():
    return "HELLO WORLD"

這段程式碼的意思是,我們把"HELLO WORLD"返回給路徑為"/"的API。這也就是說,如果我把這段程式碼改成了:

from app import app

@app.route('/hello')
def index():
    return "HELLO WORLD"

那麼我們就需要開啟http://127.0.0.1:5000/hello才能看到"HELLO WORLD"了。可是如果我想返回的是一個HTML頁面怎麼辦?那麼我們可以把我們想要返回的頁面的html放在markdown-toolkit/app/templates/資料夾中,然後從Flask自帶的庫中使用render_template來將這個頁面返回給前端。

想要嘗試,你可以從https://github.com/zhu-y/markdown-toolkit/blob/master/app/templates/index.html 拷貝我這部分的程式碼到你的markdown-toolkit/app/templates/資料夾中。然後將 md2html.py的程式碼改為下方這樣:

from app import app

from flask import render_template

@app.route('/')
def index():
    return render_template('index.html')

再回到markdown-toolkit/,通過

python run.py

來執行應用,你就應該可以看到這樣的頁面了:

到此為止,你應該對Flask有一個基本的瞭解了。

 


 

 

在下一篇博文裡,我會講到更加具體的細節。如有疏漏、建議,還請大家指出。