基于flask的微信開發(fā)
公眾號(hào)進(jìn)行簡單的開發(fā),使用的是webpy這個(gè)框架,確實(shí)輕巧,也容易上手,但是后來了解到作者已經(jīng)自殺,框架也沒有人在維護(hù)了,所以就放棄了。不過還是致敬作者。這次打算把原先開發(fā)的內(nèi)容遷移到flask上,據(jù)說也是比較輕巧,且擴(kuò)展性非常好,所以有了這個(gè)文章,讓我們一起來走進(jìn)flask的世界。
flask的安裝
pip install flask
但是我們建議是在虛擬環(huán)境下去安裝,這樣子才不會(huì)污染全局的環(huán)境,造成一些不必要的錯(cuò)誤。
最小的應(yīng)用
額外說一些,其實(shí)flask用來構(gòu)建web應(yīng)用,web應(yīng)用是基于http協(xié)議的。換句話說,我們可以這樣子認(rèn)為,我們創(chuàng)建頁面,通過http協(xié)議進(jìn)行網(wǎng)絡(luò)之間的傳輸,實(shí)現(xiàn)信息的共享。
測(cè)試代碼:
from flask import Flask
app=Flask(__name__)
@app.route("/")
def index():
return "hello,world"
if __name__=="__main__":
app.run()
解析:
可以將Flask看成是我們開發(fā)的程序,@app.route設(shè)置路由,所謂的路由就是將某個(gè)url路徑映射到哪一段代碼上。像上邊,我們將/映射到index函數(shù)上,這個(gè)模式和.net非常的相似。其實(shí)index函數(shù)是幫助我們生成和定制http協(xié)議中的回包的,這樣理解更好一些。
app.run讓我們的代碼跑在本地的服務(wù)器上,是flask內(nèi)置的服務(wù)器。
調(diào)試模式:
我們可以在啟動(dòng)的時(shí)候指定服務(wù)器為調(diào)試模式,調(diào)試模式下,當(dāng)我們修改代碼后,服務(wù)器會(huì)自定的重新進(jìn)行加載。
設(shè)置的方式:
app.run(debug=True) or app.debug=True app.run()
路由
路由的設(shè)置是通過裝飾器來實(shí)現(xiàn)的,裝飾器可以實(shí)現(xiàn)橫向切入,即在運(yùn)行這個(gè)函數(shù)的時(shí)候,可以先運(yùn)行其他的代碼。像.net里面的注解。
在路由里面指定變量規(guī)則
給url添加變量的規(guī)則是<變量類型:變量名>
變量類型有:int float path(輸入的部分是路徑)
測(cè)試代碼:
@app.route("/hello/<username>")
def hello(username):
return "hello %s" % username
@app.route("/hello1/<int:c>")
def count(c):
return "you entered %d" % c
@app.route("/hello2/<path:p>")
def hello2(p):
return "the path is %s" % p
生成url
url_for函數(shù)生成url
這個(gè)函數(shù)的第一個(gè)參數(shù)是一個(gè)函數(shù)的名字,第二個(gè)可以傳遞參數(shù)
設(shè)置http方法
通過設(shè)置app.route()這個(gè)函數(shù)的methods參數(shù),我們可以讓函數(shù)支持相應(yīng)的http方法,methods參數(shù)是一個(gè)list,我們可以傳相應(yīng)的方法進(jìn)去
測(cè)試代碼
@app.route("/testzz",methods=["GET","POST"])
def testzz():
if request.method=="GET":
return "the get"
elif request.method=="POST":
return "the post"
else:
pass
靜態(tài)文件的支持
我們會(huì)在網(wǎng)頁中引用一些css或者是一些圖片之類的東西。
這里使用慣例,我們可以將靜態(tài)的內(nèi)容放在static目錄下,并且路由系統(tǒng)已經(jīng)為我們做好了這個(gè)映射,我們可以使用static/文件名來訪問
模板渲染
我們使用Python來生成html是一件很苦逼的事情,很繁瑣,也很麻煩,所以我們這里使用模板引擎來生成前端的HTML頁面。flask中配備了jinjia2模板引擎。
測(cè)試代碼:
@app.route("/testtemplate")
@app.route("/testtemplate/<username>")
def testtemplate(username=None):
return render_template("test.html",username=username)
<!doctype html>
<html>
<title>hello from flask</title>
{% if username %}
hello {{username}}
{% else %}
hello,world
{% endif %}
</html>
訪問請(qǐng)求數(shù)據(jù)
獲取請(qǐng)求數(shù)據(jù),我們通過請(qǐng)求對(duì)象request
獲取GET提交的數(shù)據(jù) request.args.get()
獲取POST或者PUT提交的數(shù)據(jù) request.form[“”]
代碼測(cè)試:
def login():
if request.method=="GET":
username=request.args.get("username")
passwd=request.args.get("passwd")
return render_template("login.html",m="GET METHOD",username=username,passwd=passwd)
elif request.method=="POST":
username=request.form["username"]
passwd=request.form["passwd"]
return render_template("login.html",m="POST METHOD",username=username,passwd=passwd)
else:
return "error"
文件上傳
上傳到服務(wù)器端的文件,我們可以通過request.files這個(gè)對(duì)象來獲取
測(cè)試代碼:
@app.route("/upload",methods=["GET","POST"])
def upload():
if request.method=="POST":
f=request.files["test"]
f.save(werkzeug.secure_filename(f.filename))
return "ok"
elif request.method=="GET":
return render_template("upload.html")
else:
return "error"
notice:
secure_filename這個(gè)函數(shù)可以為程序提供安全性,保存前確保使用這個(gè)函數(shù),這個(gè)函數(shù)在werkseug這個(gè)庫里面
cookie解析
cookie是用來跟蹤用戶的。flask中訪問和設(shè)置cookie可以通過cookies和set_cookie來實(shí)現(xiàn)。
設(shè)置cookie
通常我們?cè)谠谝晥D函數(shù)中返回一個(gè)視圖,其實(shí)也是相當(dāng)于返回一個(gè)字符串的,只不過這個(gè)字符串的內(nèi)容是html內(nèi)容,flask幫助我們封裝了response的包,我們可以自己來定制這個(gè)response,通過flask中的make_response這個(gè)函數(shù)。設(shè)置cookie是需要設(shè)置響應(yīng)體的,所以需要我們定制response。
設(shè)置cookie
測(cè)試代碼
@app.route("/setcookie")
def setCookie():
resp=make_response()
resp.set_cookie("username","zhanggd")
return resp
獲取cookie
從客戶端接受到的請(qǐng)求包的內(nèi)容會(huì)被flask封裝進(jìn)request這個(gè)對(duì)象內(nèi),我們通過這個(gè)對(duì)象來獲取cookie
測(cè)試代碼
@app.route("/getcookie")
def getCookie():
c=request.cookies["username"]
return c
重定向和錯(cuò)誤
重定向
當(dāng)訪問一個(gè)url的時(shí)候,跳轉(zhuǎn)到另一個(gè)url對(duì)應(yīng)的位置。
整個(gè)過程為:
當(dāng)請(qǐng)求這個(gè)url的時(shí)候,返回一個(gè)code為302的包,然后瀏覽器會(huì)訪問302中l(wèi)ocation中指定的url
測(cè)試代碼:
@app.route("/")
def index():
return redirect(url_for("test"))
錯(cuò)誤
當(dāng)瀏覽器訪問非法的頁面,或者是提交了非法的內(nèi)容,我們將要返回給他錯(cuò)誤的頁面。
返回一個(gè)401
測(cè)試代碼
@app.route("/test2")
def test3():
abort(401)
自定義404頁面(同樣通過abort進(jìn)行跳轉(zhuǎn))
@app.errorhandler(404)
def page_not_found(error):
return render_template("404.html"),404
關(guān)于響應(yīng)
我們?cè)谝晥D函數(shù)里面可以返回三種類型的值:
字符串:如果返回的是字符串,flask直接封裝進(jìn)回包的體內(nèi)
元祖:如果是元祖的話,flask會(huì)根據(jù)你設(shè)置的相應(yīng)內(nèi)容來設(shè)置相應(yīng)的回包,元祖的格式為(視圖,status,headers)headers可以是list或者是字典
響應(yīng)對(duì)象:如果是直接響應(yīng)對(duì)象,直接根據(jù)這個(gè)對(duì)象來構(gòu)造
操作回包代碼測(cè)試:
@app.route("/test3")
def test4():
resp=make_response(render_template("404.html"),404)
resp.headers["test"]="test"
return resp
會(huì)話
允許在不同請(qǐng)求之間存儲(chǔ)用戶的信息。
flask中使用session,這個(gè)是session是基于cookie的
我們需要設(shè)置一個(gè)秘鑰:app.secret_key=””
session為一個(gè)字典,設(shè)置值session[“username”]=username
刪除session中的值,session.pop(“username”)
咨詢熱線
010-85377344
135-21581588
微信客服
QQ客服
3026106565 點(diǎn)擊咨詢