本文學(xué)習(xí)人群
經(jīng)過上篇文章的學(xué)習(xí)洛史,如果已經(jīng)可以在外網(wǎng)打開顯示出“Test Success”的同學(xué)硼婿,看這篇就會很輕松了轧葛。本文目標(biāo)在與打通Flask和數(shù)據(jù)庫之間的鏈接杆查,從而 輸出/接收 json數(shù)據(jù)扮惦。好了,廢話不多說亲桦,我們開始正題崖蜜!
Flask路由
咱先別急著立馬要鏈接數(shù)據(jù)庫掺栅,在此之前我們需要了解下Flask的路由,這個(gè)是我們將做好的數(shù)據(jù)接口發(fā)布到外網(wǎng)的一個(gè)重要環(huán)節(jié)纳猪。
這里咱不做太多的文字解釋氧卧,直接上代碼:
from flask import Flask,request
app = Flask(__name__)
#根目錄
@app.route('/')
def index():
return 'Index Page'
#路由到Hello
@app.route('/hello')
def hello():
return 'Hello, World'
#傳單個(gè)參數(shù)路由
@app.route('/user/<username>')
def show_user_profile(username):
return 'User %s' % username
# 傳參數(shù)前修改數(shù)據(jù)類型,可選擇的類型有string氏堤、int沙绝、float、path鼠锈、any闪檬、uuid
@app.route('/post/<int:post_id>')
def show_post(post_id):
return 'Post %d' % post_id
#做接口的時(shí)候主要用的是這個(gè)類路由
@app.route('/login', methods=['GET', 'POST'])
def login():
if request.method == 'POST':
return '這是一個(gè)post請求'
else:
return '這是一個(gè)get請求'
上方是一些簡單的路由,但是做數(shù)據(jù)交互购笆,不會只傳一些單字段數(shù)據(jù)交互粗悯,在這,就需要引入json的內(nèi)容(我是選擇這個(gè)交互方式同欠,其他還有很多不一一列舉了)样傍。廢話不多說,上代碼:
#記得要import json铺遂,request
@app.route('/login',methods=['GET','POST'])
def login():
#json獲取
if request.method == 'POST':
a = request.get_data()
b = json.loads(a)
return json.dumps(b)
#json輸出
else:
usr ='[{"name":"klaus","sex":1}]'
usrjson = json.dumps(users)
return usrjson
具體的json格式說明衫哥,這里就不詳細(xì)說了,后面我會結(jié)合小程序的案例襟锐,來說明post/get請求后續(xù)該如何完成撤逢。
鏈接數(shù)據(jù)庫
開發(fā)環(huán)境
上述的路由方法還沒鏈接到數(shù)據(jù)庫中,接下來開始鏈接數(shù)據(jù)粮坞。這里我選用的是mssql數(shù)據(jù)庫蚊荣,先上代碼,再做解釋:
from flask import Flask,request, jsonify
import pymssql
import json
# server 數(shù)據(jù)庫服務(wù)器名稱或IP
# user 用戶名
# password 密碼
# database 數(shù)據(jù)庫名稱
conn = pymssql.connect('server','user','password','database')
cursor = conn.cursor()
app = Flask(__name__)
#記得要import json莫杈,request
@app.route('/login',methods=['GET','POST'])
def login():
if request.method == 'POST':
#插入數(shù)據(jù)(這樣的代碼效率不高互例,后續(xù)更新)
for row in cursor:
cursor.executemany("INSERT INTO persons VALUES (%d, %s, %s)",(row[0],row[1],row[2]))
conn.commit()
else:
# 查詢操作
cursor.execute('SELECT * FROM persons WHERE userName=%s', 'John Doe')
row = cursor.fetchone()
usrjson = json.dumps(row)
return usrjson
# 關(guān)閉連接
conn.close()
在運(yùn)行這段代碼的時(shí)候會發(fā)現(xiàn)pymssql還未安裝,這需要以下操作:
http://www.lfd.uci.edu/~gohlke/pythonlibs/下載pymssql包(pymssql-2.1.3-cp36-cp36m-win_amd64.whl),并把他放到python安裝路徑的script文件夾下
在cmd,cd到python安裝路徑(C:\Users\lenovo\AppData\Local\Programs\Python\Python36\script)
用pip安裝whl文件姓迅。在cmd中輸入pip install pymssql-2.1.3-cp36-cp36m-win_amd64.whl
這樣敲霍,上述代碼就可以在本地正常運(yùn)行了。(數(shù)據(jù)庫中的persons沒建好的丁存,先去建張表)
數(shù)據(jù)庫操作簡單的說就是 增刪改查肩杈,上面的代碼描述的是增和查的動(dòng)作,改和刪怎么做解寝,就不詳細(xì)說明了扩然。
服務(wù)器環(huán)境
理論上來上,服務(wù)器環(huán)境按上述的內(nèi)容做下聋伦,基本上就可以正常運(yùn)行了夫偶,并將接口開放到外網(wǎng)了界睁,但可能會碰到一個(gè)問題,就是mod_wsgi + pymssql訪問SQL Server阻塞兵拢,也就是數(shù)據(jù)一直沒鏈接成功翻斟,在查看「C:\Apache24\logs\error.log」文件時(shí)也沒有任何錯(cuò)誤日志。
這時(shí)候只要在「C:\Apache24\conf\httpd.conf」中加入配置:
WSGIApplicationGroup %{GLOBAL}
然后重啟Apache服務(wù)器即可正常運(yùn)行说铃!
參考資料:
數(shù)據(jù)庫鏈接相關(guān):http://blog.sina.com.cn/s/blog_137f673a50102y6sq.html
數(shù)據(jù)庫鏈接阻塞:https://blog.csdn.net/chosen0ne/article/details/31367961