1 Flask框架的優點?
相信作Python這一塊的程序員都有據說這三個框架,就像神同樣的存在,每個框架的介紹我就不寫出來了,感興趣能夠本身百度瞭解瞭解!下面我就說正事
Django:Python 界最全能的 web 開發框架,battery-include 各類功能完備,可維護性和開發速度一級棒。常有人說 Django 慢,其實主要慢在 Django ORM 與數據庫的交互上,因此是否選用 Django,取決於項目對數據庫交互的要求以及各類優化。而對於 Django 的同步特性致使吞吐量小的問題,其實能夠經過 Celery 等解決,倒不是一個根本問題。Django 的項目表明:Instagram,Guardian。
Tornado:天生異步,性能強悍是 Tornado 的名片,然而 Tornado 相比 Django 是較爲原始的框架,諸多內容須要本身去處理。固然,隨着項目愈來愈大,框架可以提供的功能佔比愈來愈小,更多的內容須要團隊本身去實現,而大項目每每須要性能的保證,這時候 Tornado 就是比較好的選擇。Tornado項目表明:知乎。
Flask:微框架的典範,號稱 Python 代碼寫得最好的項目之一。Flask 的靈活性,也是雙刃劍:能用好 Flask 的,能夠作成 Pinterest,用很差就是災難(顯然對任何框架都是這樣)。Flask 雖然是微框架,可是也能夠作成規模化的 Flask。加上 Flask 能夠自由選擇本身的數據庫交互組件(一般是 Flask-SQLAlchemy),並且加上 celery + redis 等異步特性之後,Flask 的性能相對 Tornado 也不逞多讓,也許Flask 的靈活性多是某些團隊更須要的。
總結,蘿蔔白菜各有所愛,然而機器的效率(程序的性能)與程序員的效率(可維護性、開發速度)是一對矛盾。選擇什麼樣的架構組合,取決於產品的特性以及團隊的能力。
2 Flask框架依賴組件
依賴jinja2模板引擎
依賴werkzurg協議
3 Flask藍圖的做用
blueprint把實現不一樣功能的module分開.也就是把一個大的App分割成各自實現不一樣功能的module. 在一個blueprint中能夠調用另外一個blueprint的視圖函數, 但要加相應的blueprint名.
4.列舉使用的Flask第三方組件?
# Flask組件
flask-session session放在redis
flask-SQLAlchemy 如django裏的ORM操做
flask-migrate 數據庫遷移
flask-script 自定義命令
blinker 信號-觸發信號
# 第三方組件
Wtforms 快速建立前端標籤、文本校驗
dbutile 建立數據庫鏈接池
gevnet-websocket 實現websocket
# 自定義Flask組件
自定義auth認證
參考flask-login組件
5 簡述Flask上下文管理流程 ?
falsk上下文管理能夠分爲三個階段:
一、請求上文 -> 當請求進來,第一件事就是要把當前這個請求在我服務器上的線程開闢一個空間(線程對應的空間,必須含有stack對用一個列表存放ctx(request/session),
具體-->:將request,session封裝在 RequestContext類中
app,g封裝在AppContext類中 並經過LocalStack將requestcontext和appcontext放入Local類中 在local類中,以線程ID號做爲key的字典
二、請求下文: 經過localproxy--->偏函數--->localstack--->local取值
三、'請求響應時':-->要將上下文管理中的數據清除 先執行save.session()再各自執行pop(),將local中的數據清除
6 Flask中的g
的做用?
在flask中,有一個專門用來存儲用戶信息的g對象,g的全稱的爲global。 當請求進來將g和current_app封裝爲一個APPContext類, 再經過LocalStack將Appcontext放入Local中,取值時經過偏函數在LocalStack、local中取值; 響應時將local中的g數據刪除
g與session的區別 session對象是能夠跨request的,只要session還未失效,不一樣的request的請求會獲取到同一個session,可是g對象 不是,g對象不須要管過時時間,請求一次就g對象就改變了一次,或者從新賦值了一次。那麼g對象該如何使用呢?看代碼。
7 Flask中上下文管理主要涉及到了那些相關的類?並描述類主要做用?
RequestContext # 封裝進來的請求(賦值給ctx)request.session
AppContext # 封裝app_ctx
LocalStack # 將local對象中的數據維護成一個棧(先進後出)
Local # 保存請求上下文對象和app上下文對象
8 爲何要Flask把Local對象中的的值stack維護成一個列表?
由於經過維護成列表,能夠實現一個棧的數據結構,進棧出棧時只取一個數據,巧妙的簡化了問題。 還有,在多app應用時,能夠實現數據隔離;列表裏不會加數據,而是會生成一個新的列表 local是一個字典,字典裏key(stack)是惟一標識,value是一個列表
9 Flask中多app應用是怎麼完成?
請求進來時,能夠根據URL的不一樣,交給不一樣的APP處理。藍圖也能夠實現。
# app1 = Flask('app01')
# app2 = Flask('app02')
# @app1.route('/index')
# @app2.route('/index2')
源碼中在DispatcherMiddleware類裏調用app2.__call__, 原理其實就是URL分割,而後將請求分發給指定的app。以後app也按單app的流程走。就是從app.__call__走。
10 在Flask中實現WebSocket須要什麼組件?
gevent-websocket
快速建立前端標籤、文本校驗;如django的ModelForm
12 Flask框架默認session處理機制?
基於cookie實現, 存儲在 客戶端的cookie中
必須設置默認的key才能生效
13 解釋Flask框架中的Local對象和threading.local對象的區別?
有些應用使用的是greenlet協程,這種狀況下沒法保證協程之間數據的隔離,由於不一樣的協程能夠在同一個線程當中。 即便使用的是線程,WSGI應用也沒法保證每一個http請求使用的都是不一樣的線程,由於後一個http請求可能使用的是以前的 http請求的線程,這樣的話存儲於thread local中的數據多是以前殘留的數據。
爲了解決上述問題,Werkzeug開發了本身的local對象,這也是爲何咱們須要Werkzeug的local對象
14 Flask中blinker是什麼?
flask中的信號blinker
信號主要是讓開發者但是在flask請求過程當中定製一些行爲。
或者說flask在列表裏面預留了幾個空列表,在裏面存東西。
簡言之,信號容許某個'發送者'通知'接收者'有事情發生了
15 SQLAlchemy中的session和scoped_session的區別?
scoped_session封裝了兩個值 Session 和 registry,registry加括號就執行了ThreadLocalRegistry的 __call__方法,
若是當前本地線程中有session就返回session,沒有就將session添加到了本地線程 scoped_session爲每一個線程建立一個session,確保了線程安全
16 SQLAlchemy如何執行原生SQL?
# 總的數據sql
sql_str = "select * from (" \
"select *, 0 as ord from sale_goods where goods_type = 'sale-goods' and delete = false and total_count > 0 and deadline > now()" \
"union " \
"select *, 1 as ord from sale_goods where goods_type = 'sale-goods' and delete = false and (total_count <= 0 or deadline <= now())" \
") sale_goods_mall order by ord asc, c_time desc limit %d offset %d;" % (limit, limit * (pages - 1))
# 在售的數據sql
in_sale_sql = "select *, 0 as ord from sale_goods where goods_type = 'sale-goods' and delete = false and total_count > 0 and deadline > now();"
# sqlalchemy執行sql
data_query = db.session.execute(sql_str)
in_sale_query = db.session.execute(in_sale_sql)
17 ORM的實現原理?
1. 映射類:它的做用是描述數據庫表的結構,表中的字段在類中被描述成屬性,未來就能夠實現把表中的記錄映射成爲該類 的對象。
2. 映射文件:它的做用是指定數據庫表和映射類之間的關係,包括映射類和數據庫表的對應關係、表字段和類屬性類型的對 應關係以及表字段和類屬性名稱的對應關係等。
3. 數據庫配置文件:它的做用是指定與數據庫鏈接時須要的鏈接信息,好比鏈接哪中數據庫、登陸用戶名、登陸密碼以及 鏈接字符串等。