用 Python 構建 web 應用
如果說僅僅要用 Python 構建 web 應用,可以將 socket 連接、HTTP 原始請求和響應格式等涉及網絡基礎的東西交給現成的庫來實現,只需要專注於 web 端界面、交互、業務邏輯以及數據庫的設計,那么使用 Python 構建一個 web 應用實際上就比較簡單了。
關於 Python 這門語言
這是我第一次使用 Python 語言,簡單了看了下 廖雪峰的 Python 教程,了解了相應的語法和 web 開發相關的內容。其實在編寫代碼時能感受到,Python 確實挺容易上手的,有些地方看上去語法很奇怪或者說難以理解,但是回過頭對照教程里的基礎知識又能夠明白個大概。Python 中有一些如 __main__
、 __init__
和 __name__
這類特殊變量,在剛開始使用的時候按照教程寫,然后根據 Python 教程對照着看,感覺還是可以明白的。
簡單的 web 應用:Hello Web
這一部分可以看下 廖雪峰的 Python 教程 中關於 WSGI 接口的內容,簡單提一下:
# simple_server.py
from wsgiref.simple_server import make_server
def application( environ, start_response ):
start_response( '200 OK', [ ('Content-Type', 'text/html') ] )
return [b'<h1>Hello, Web</h1>']
httpd = make_server( '', 8080, application )
print('Serveing HTTP on port 8080...')
httpd.serve_forever()
如果你使用的 Python 是 3.x,那么在運行上面這段代碼時可能就會報錯,如果報錯內容和 wsgiref handlers 有關,那么可以參考 python3.4中自定義wsgi函數,make_server函數報錯問題 這篇文章的解決方法,將 /path_to_python_installation/Lib/wsgiref
目錄下的 handlers.py
文件中關於 finish_response
的部分修改(約第 180 行):將 self.write(data)
改成 self.write(data.encode())
。
然后打開瀏覽器,訪問 127.0.0.1:8080
端口就可以看到 “Hello Web” 了。
使用 flask 框架進行開發
上面使用 wsgiref 可以很方便的制作簡單的 web 應用。但是如果要制作較復雜的應用,那么還是使用框架吧,這樣會簡化很多工作。我使用的是 flask 框架。使用 pip install flask
安裝即可。
雖說框架實現隱藏了很多細節的東西,但是要掌握它也要花點時間,好在它的文檔比較詳細,而且有一些基礎的示例,能夠很快做出一個頁面來:
# webserver.py
from flask import Flask
from flask import request, render_template, url_for, json, make_response, redirect
app = Flask( '__main__' )
@app.route( "/", methods = [ 'GET', 'POST' ] )
def home():
resp = make_response( render_template( 'index.html' , title='test' ) )
resp.set_cookie( 'username', 'test username' )
# for user in db.query( 'select * from `account`' ):
# print(user['port'], user['password'])
return resp
上面這段代碼就可以讓你在訪問瀏覽器時得到一個簡單的 web 界面,另外我還在網頁中存儲了一個 username: test username
的 cookie。使用 python webserver.py
運行服務器程序,然后在瀏覽器訪問 127.0.0.1:5000
就可以看到一個簡單的網頁了。
使用 flask 比較麻煩的一點是作為模版的 html 文件需要放在 webserver.py
文件同級目錄的 templates
目錄,也可以在構造 Flask 對象的時候指定模板路徑,但是感覺還是不夠靈活。模板文件的語法可以參考 jinjia2。
還有一點是關於靜態文件的加載,靜態文件需要放在同級目錄的 static
目錄,如果直接在 html 中引用 /css/bootstrap.min.css
,在瀏覽器訪問時會出現找不到文件的問題,可以將引用的路徑改成 /static/css/bootstrap.min.css
,我在 webserver 中添加了一個方法:
@app.route( '/css/<filename>', methods = [ 'GET' ] )
def static_css( filename ) :
with open( './static/css/' + filename, 'r', encoding='utf-8' ) as f :
resp = make_response( f.read() )
resp.mimetype = 'text/css'
return resp
在讀取 css 靜態文件時,到相應的目錄下找到對應的文件讀取內容,然后把響應的 mimetype 改成 text/css
,否則的話默認響應類型是 text/plain
,瀏覽器會出現警告。
小結
至此,一個簡單的 web 應用就做好了,但是內容還比較少,而且也沒有具體的業務邏輯和數據庫操作。相關的內容 flask 框架已經提供了,需要查看 flask 教程。