1. 程式人生 > 實用技巧 >真零基礎Python開發web

真零基礎Python開發web

Python開發web服務的優勢是開發效率高,可能只需要java五分之一的程式碼量。
Python搭建web服務有許多框架,本文介紹Django和bottle兩個框架。

Django

安裝

首先,安裝該框架

安裝成功,版本是1.11.28. 框架的檔案安裝在\python27\Scripts目錄下(搜尋電腦中Python安裝目錄下的Scripts就對了)。

建立專案

先進入\python27\Scripts目錄,建立專案jinanwx(名稱隨便起)

同一個目錄下可以看到新建立工程的目錄

開發自己模組

進入python27\Scripts\jinanwx\jinanwx。新建我們自己的模組

jgotest01.py裡面寫簡單的程式碼如下

模組功能就是返回個json格式結果。

修改urls模組

然後需要改urls.py模組

目錄檔案如下

就這麼簡單,新建一個檔案再修改一個檔案,就成了。

啟動服務

回到上一級目錄啟動服務

啟動成功,瀏覽器訪問試試

bottle

開發功能不是特別複雜的web服務,可以考慮使用bottle框架,它比Django輕量。bottle例子在Linux下演示。

安裝

使用bottle框架首先安裝。一個指令搞定。

# pip install bottle  

進入Python命令列import bottle,沒報錯就是成功了。

程式碼

我的web服務就一個檔案bottleweb.py,程式碼如下,一些解釋在程式碼的註釋裡

#coding=utf-8  
from bottle import (run, route, get, post, put, delete, request, hook, response, static_file, app)  
import json  
import MySQLdb #本例子需要操作資料庫,否則可以不寫這行,這個資料庫包pip估計安裝不會成功,我是用yum install MySQL-python成功的  
import sys  
reload(sys)    
sys.setdefaultencoding('utf8')  

import bottle  
app = bottle.default_app()#處理靜態資源需要定義,沒有靜態資源可以不寫這行  
#搭建vue腳手架前後臺聯調時要下面兩個@hook內容,否則會報跨域訪問資源的錯誤  
@hook('before_request')  
def validate():  
    REQUEST_METHOD = request.environ.get('REQUEST_METHOD')  

    HTTP_ACCESS_CONTROL_REQUEST_METHOD = request.environ.get('HTTP_ACCESS_CONTROL_REQUEST_METHOD')  
    if REQUEST_METHOD == 'OPTIONS' and HTTP_ACCESS_CONTROL_REQUEST_METHOD:  
        request.environ['REQUEST_METHOD'] = HTTP_ACCESS_CONTROL_REQUEST_METHOD  


@hook('after_request')  
def enable_cors():  
    response.headers['Access-Control-Allow-Origin'] = '*'  
    response.headers['Access-Control-Allow-Methods'] = 'GET,POST,PUT,DELETE,OPTIONS'  
    response.headers['Access-Control-Allow-Headers'] = '*'  

@route('/test2020/dist/<path>')#靜態資源在web服務下的地址,沒放前端的靜態資源這幾個route和app.route可以不寫  
def stat(path):  
    return static_file(path, root='./dist/')  

@app.route('/test2020/dist/static/js/<path>')    
def js(path):  #這幾個目錄我寫成這樣是因為vue打包完後目錄結構就是dist 裡面static等等  
    return static_file(path, root='./dist/static/js/')  

@app.route('/test2020/dist/static/css/<path>')   
def css(path):   
    return static_file(path, root='./dist/static/css/')  
    
@get('/test2020/date')#返回某個表中的日期,看sql你就明白了  
def helloins():  
    db = MySQLdb.connect("127.0.0.1", "yourusername", "yourpassword", "yourDBname", charset='utf8' )  
    cursor = db.cursor()  
    sql = "select DISTINCT date from testtable"  
    print sql  
    cursor.execute(sql)  
    data = cursor.fetchall()  
    jsondata={}  
    results=[]  
    for row in data:  
        result = {}  
        result['DATE'] = row[0]  
        results.append(result)  
    jsondata['code']=0  
    jsondata['datas']=results  
    return jsondata  #返回json格式為了方便前端vue接收處理,其實返回各種型別都可以  
    
@get('/test2020/helloworld')  
def helloworld():  
    return 'hello world!'  
    
if __name__ == '__main__':  
    run(host='0.0.0.0', port=2020, debug=True, reloader=True)  

bottleweb.py所在目錄執行

#python bottleweb.py

web服務就啟動了。瀏覽器訪問http://127.0.0.1:2020/test2020/helloworld看效果。

如果安裝了MySQL資料庫可以測試test2020/date的url是否能返回結果

資料庫只要有下面的資料就可以

前端頁面是這個樣子的,給使用者選擇某個日期。

前端是用vue+vux來開發的,開發完打包打出的東西上傳到程式碼中提到的dist靜態資源目錄下。
如果覺得上面的程式碼有點複雜,可以把所有route, app.route的東西刪除,把/test2020/date語句塊也刪除,把@hook刪除,MySQL的東西刪除,前端的東西也完全不考慮,就是最簡單的bottle web服務,相當於hello world。
建議儘量懂上面的程式碼,涉及了靜態資源,資料庫,是web服務必須的內容。

pip升級的坑

分享一個遇到的pip的問題,我Python版本很低2.6.6。本來通過安裝yum的epel,已經成功安裝了好用的pip。但是每次我用pip命令,最下方都會提示升級

You are using pip version 9.0.3, however version 20.0.2 is available.
You should consider upgrading via the 'pip install --upgrade pip' command

我執行了pip install --upgrade pip升級,然後pip指令就不能用了。而且升級了之後,在想安裝回低版本的pip就沒有對應的安裝包了。yum只能找到20.0.2版本的(老版本會被覆蓋難道?)。

http://bootstrap.pypa.io/2.6/get-pip.py  

下載了get-pip.py也無法安裝成功。最後在上面的地址下載到了2.6版本的安裝檔案,才成功安裝可以使用的pip。

總結

相比java,python開發web程式碼量少,需要安裝的庫少,如果能滿足功能和效能要求,python可能是更好的選擇。