1. 程式人生 > >python3+flask 開發web(二)

python3+flask 開發web(二)

1、Flask中的請求物件request

在介紹flask中的request之前,先簡單介紹下python中的ThreadLocal物件。ThreadLocal,故名思義,就是執行緒中的全域性變數,

看一下下面的程式碼:

import threading

localobj=threading.local()

def threadfunc(name):
    localobj.name=name
    print ('localobj.name is %s' %name)

if __name__=="__main__":
    t1=threading.Thread(target=threadfunc,args=('Hyman',))
    t2 = threading.Thread(target=threadfunc, args=('navylu',))
    t1.start()
    t2.start()
    t1.join()
    t2.join()

執行結果:

localobj就是一個Threadlocal物件,他對於每個執行緒來說是全域性的,但是對於不同執行緒之間又可以保持不同。而flask中的請求物件request就是這類物件。在多執行緒伺服器中客戶端每建立一個連結,伺服器就建立一個執行緒,每個執行緒中就會有一個request來表示客戶端的連結請求資訊。


再來段程式碼:

from flask import Flask
from flask import request

app=Flask(__name__)


@app.route('/')
def index():
    user_agent=request.headers.get('User_Agent')
    return 'user_agent is %s' %user_agent
    return 'hello world'

if __name__=='__main__':

    app.run()

執行後,瀏覽器開啟:

2、python中修飾器/裝飾器,它的作用:裝飾器本質上是一個Python函式,它可以讓其他函式在不需要做任何程式碼變動的前提下增加額外功能,裝飾器的返回值也是一個函式物件

來上一段程式碼:

from time import ctime,sleep

def settime(myfunc):
    def tempfun():
        print('[%s] %s called' %(ctime(),myfunc.__name__))
        return myfunc
    return tempfun

@settime
def myfunc():
    pass

myfunc()
sleep(4)

for i in range(2):
    myfunc()
    sleep(1)

settime就是myfunc的一個修飾器,修飾器分為帶參和不帶參兩種,這裡的引數是指除被修飾函式以外的引數,上述修飾器屬於不帶參修飾器,修飾器中需要自己定義一個額外的函式(temfun()),該函式把被修飾函式(myfunc())作為返回值,而修飾器將該函式(temfun())作為返回值。函式一旦被修飾器修飾 ,以後再呼叫時就不是單純的呼叫該函式,上述程式碼實現了在每次呼叫myfunc前列印輸出當前的時間。

flask中將每個檢視函式都用修飾器進行了修飾,並將其儲存在全域性的對映中,當IE客戶端輸入所需的URL時,會從該對映中查詢到對應的檢視函式,然後進行呼叫