Flask之run函式背後的秘密

2021-08-07 23:16:07 字數 2493 閱讀 8283

乙個最簡單的基於flask的web應用:

flask版本為0.1

from flask import flask

defhello_world

():return

'hello world!'

if __name__ == '__main__':

下面分析一下執行run()函式背後的細節:

flask 的run方法如下:

def

run(self, host='localhost', port=5000, **options):

# ......

from werkzeug import run_******

# ......

return run_******(host, port, self, **options)

flask類的run方法呼叫werkzeug中的run_******方法,預設情況下訪問的是本機的5000埠。

def

run_******

extra_files=none, threaded=false, processes=1):

definner

(): processes)

try:

srv.serve_forever()

except keyboardinterrupt:

pass

if use_reloader:

#---

else:

inner()

use_reloader預設為false,呼叫內部的inner函式。

inner函式有兩個功能:

1.呼叫make_server函式

def

make_server

threaded=false, processes=1):

# ....

else:

handler = baserequesthandler

server = wsgiserver

srv = server((host, port), handler)

return srv

這裡使用預設的引數,指定handler和server的具體型別。

server是繫結的wsgiserver。handler繫結的是baserequesthandler,檢視werkzeug.serving原始碼可以看到:

baserequesthandler =wsgirequesthandler,
而wsgirequesthandler是實現了wsgi**的request handler

make_server的任務是返回乙個wsgiserver伺服器例項。

wsgiserver是一種實現了wsgi協議的basehttpserver,其繼承自httpserver.

這裡依賴的是wsgiref包。

2.執行serve_forever方法,一直監聽來自客戶端的請求

wsgiserver的serve_forever實際是呼叫其父類class baseserver的方法:

def

serve_forever

(self, poll_interval=0.5):

"""handle one request at a time until shutdown."""

# 處理客戶端的請求,直到服務關閉

self.__is_shut_down.clear()

try:

while

not self.__shutdown_request:

r, w, e = _eintr_retry(

select.select, [self], , ,

poll_interval)

if self in r:

self._handle_request_noblock()

self.service_actions()

finally:

self.__shutdown_request = false

self.__is_shut_down.set()

經過上面的分析,畫出整個run函式背後的流程圖如下:

IBM Storwize V7000背後的秘密

10月22日,ibm新一代中端儲存系統storwize v7000亮相西安。據ibm儲存系統全球市場與銷售副總裁dan galvan介紹,ibm storwize v7000的最大優點是能夠簡化儲存設定與管理,節省大量的儲存機架空間,並且整合了一套先進的儲存效率軟體,可以讓中端儲存使用者充分享受智慧...

QtConcurrent系列之run函式建立多執行緒

在qt多執行緒程式設計中,我們一般使用qthread,qrunnable等類來實現多執行緒。除此之外,qt還提供了乙個更高階的實現多執行緒的方式,那就是qtconcurrent框架,qtconcurrent框架中提供了許多高階的,效能更好的多執行緒api函式,這些函式非常方便使用。本文重點介紹qtc...

Flask之鉤子函式

1 before first request deffirst request print first time request 2 before request 使用較多 defbefore request ifnothasattr g,glo1 setattr g,glo1 想要設定的 deft...