Flask面試問題

1. 解釋什么是Flask及其好處?

Flask是一個(gè)Python編寫的Web微框架,讓我們可以使用Python語言快速實(shí)現(xiàn)一個(gè)網(wǎng)站或Web服務(wù)照宝。

2. Django和Flask有什么區(qū)別?

Flask:

  • Flask確實(shí)很“輕”河哑,F(xiàn)lask自由斑匪、靈活,可擴(kuò)展性強(qiáng)盏浇,第三方庫的選擇面廣变丧,開發(fā)時(shí)可以結(jié)合自己最喜歡用的輪子,也能結(jié)合最流行最強(qiáng)大的Python庫绢掰。
  • 入門簡單痒蓬,非常適用于小型網(wǎng)站和開發(fā)web服務(wù)的API
  • 開發(fā)大型網(wǎng)站無壓力,但代碼架構(gòu)需要自己設(shè)計(jì)曼月,開發(fā)成本取決于開發(fā)者的能力
  • 各方面性能均等于或優(yōu)于Django
  • Flask與關(guān)系型數(shù)據(jù)庫的配合使用不弱于Django谊却,而其與NoSQL數(shù)據(jù)庫的配合遠(yuǎn)遠(yuǎn)優(yōu)于Django
  • Flask比Django更加Pythonic,與Python的philosophy更加吻合
    Django:
  • 太重了哑芹,除了web框架炎辨,自帶ORM和模板引擎,靈活和自由度不夠高
  • 非常適合企業(yè)級(jí)網(wǎng)站的開發(fā):快速聪姿、靠譜碴萧、穩(wěn)定,但相比于Flask末购,Django的整體生態(tài)相對(duì)封閉
  • 自帶的數(shù)據(jù)庫管理app好評(píng)如潮
  • 自帶ORM也使Django與關(guān)系型數(shù)據(jù)庫耦合度過高破喻,如果想使用MongoDB等NoSQL數(shù)據(jù),需要選取合適的第三方庫盟榴,且總感覺Django+SQL才是天生一對(duì)的搭配曹质,Django+NoSQL砍掉了Django的半壁江山。

3. Flask-WTF是什么擎场,有什么特點(diǎn)?

Flask的簡單WTForms集成羽德,包含CSRF、文件上傳和Recaptcha集成迅办。
flask-wtf可以保護(hù)表單免受跨站請(qǐng)求偽造(CSRF)的攻擊,惡意網(wǎng)站將請(qǐng)求發(fā)送到被攻擊者已登錄的其他網(wǎng)站時(shí)就會(huì)引發(fā)CSRF宅静。

form.html

 <form action="{{ url_for('wtf_form') }}" method='post'>
     {{ form.csrf_token }} #進(jìn)入csrf驗(yàn)證
     <p>{{ form.username.label }}{{ form.username(style='color:red',placeholder='請(qǐng)輸入用戶名') }}{{ form.username.errors }}</p>
     <p>{{ form.userpass.label }}{{ form.userpass() }}{{ form.userpass.errors }}</p>
     <p>{{ form.submit() }}</p>
 </form>

manage.py

from flask import Flask,render_template,request
from flask_wtf import FlaskForm   #導(dǎo)入繼承父類
from wtforms import StringField,PasswordField,SubmitField
from wtforms.validators import Length,DataRequired

class Login(FlaskForm):  #繼承自FlaskForm類
    username = StringField('用戶名',validators=[Length(min=6,max=12,message='用戶名長度為6~12位'),DataRequired(message='用戶名不能為空')])
    userpass = PasswordField('密碼',validators=[Length(min=6,max=12,message='密碼長度為6~12位'),DataRequired(message='密碼不能為空')])
    submit = SubmitField('登錄')


@app.route('/wtf_form',methods=['GET','POST'])
def wtf_form():
    form = Login()  #實(shí)例化form對(duì)象
    if request.method == 'POST':
        if form.validate_on_submit():  #數(shù)據(jù)正確 并且驗(yàn)證csrf通過
            print(request.form.get('userpass'))
            print(request.form.get('username'))
            return '數(shù)據(jù)提交成功'
    return render_template('wtf_form.html',form=form)

#注:
#1 methods 參數(shù)告訴Flask在URL映射中把這個(gè)視圖函數(shù)注冊為GET和POST請(qǐng)求的處理程序,默認(rèn)GET
#2 采用post請(qǐng)求可以通過對(duì)象很輕松訪問,GET 請(qǐng)求沒有主體,提交的數(shù)據(jù)以查詢字符串的形式附加到URL中
#3 validate_on_submit() 會(huì)調(diào)用username 字段上附屬的 DataRequired() 驗(yàn)證函數(shù)。

4. Flask腳本的常用方式是什么?

在shell中運(yùn)行腳本文件
在python編譯器中run

5. 如何在Flask中訪問會(huì)話?

一個(gè)會(huì)話基本上允許記住從一個(gè)請(qǐng)求到另一個(gè)請(qǐng)求的信息站欺。在Flask中姨夹,它使用簽名的cookie纤垂,以便用戶可以查看會(huì)話內(nèi)容并進(jìn)行修改。用戶可以修改會(huì)話磷账,只要它有密鑰Flask.secret_key峭沦。
會(huì)話(seesion)會(huì)話數(shù)據(jù)存儲(chǔ)在服務(wù)器上。 會(huì)話是客戶端登錄到服務(wù)器并注銷的時(shí)間間隔够颠。 需要在此會(huì)話中進(jìn)行的數(shù)據(jù)存儲(chǔ)在服務(wù)器上的臨時(shí)目錄中熙侍。

from flask import session導(dǎo)入會(huì)話對(duì)象
session[‘name’] = ‘a(chǎn)dmin’給會(huì)話添加變量
session.pop(‘username’, None)刪除會(huì)話的變量

6. Flask是一個(gè)MVC模型嗎?如果是,可以示例一下嗎?

基本上履磨,F(xiàn)lask是一個(gè)簡單的框架蛉抓,其行為與MVC框架相同。所以MVC是Flask的完美選擇剃诅。

7. 解釋Python Flask中的數(shù)據(jù)庫連接巷送?

python中的數(shù)據(jù)庫連接有兩種方式
在腳本中以用第三方庫正常連接,用sql語句正常操作數(shù)據(jù)庫矛辕,如mysql關(guān)系型數(shù)據(jù)庫的pymsql庫
用ORM來進(jìn)行數(shù)據(jù)庫連接笑跛,flask中典型的flask_sqlalchemy,已面向?qū)ο蟮姆绞竭M(jìn)行數(shù)據(jù)庫的連接與操作

8. 列舉Http請(qǐng)求中常見的請(qǐng)求方式?

1聊品、opions 返回服務(wù)器針對(duì)特定資源所支持的HTML請(qǐng)求方法 或web服務(wù)器發(fā)送*測試服務(wù)器功能(允許客戶端查看服務(wù)器性能)
2飞蹂、Get 向特定資源發(fā)出請(qǐng)求(請(qǐng)求指定頁面信息,并返回實(shí)體主體)
3翻屈、Post 向指定資源提交數(shù)據(jù)進(jìn)行處理請(qǐng)求(提交表單陈哑、上傳文件),又可能導(dǎo)致新的資源的建立或原有資源的修改
4伸眶、Put 向指定資源位置上上傳其最新內(nèi)容(從客戶端向服務(wù)器傳送的數(shù)據(jù)取代指定文檔的內(nèi)容)
5惊窖、Head 與服務(wù)器索與get請(qǐng)求一致的相應(yīng),響應(yīng)體不會(huì)返回厘贼,獲取包含在小消息頭中的原信息(與get請(qǐng)求類似界酒,返回的響應(yīng)中沒有具體內(nèi)容,用于獲取報(bào)頭)
6嘴秸、Delete 請(qǐng)求服務(wù)器刪除request-URL所標(biāo)示的資源(請(qǐng)求服務(wù)器刪除頁面)
7毁欣、Trace 回顯服務(wù)器收到的請(qǐng)求,用于測試和診斷
8岳掐、Connect HTTP/1.1協(xié)議中能夠?qū)⑦B接改為管道方式的代理服務(wù)器

9. 列舉Http請(qǐng)求中常見的請(qǐng)求頭?

?Accept:瀏覽器可接受的MIME類型 
?Accept-Charset: 瀏覽器通過這個(gè)頭告訴服務(wù)器凭疮,它支持哪種字符集 
?Accept-Encoding:瀏覽器能夠進(jìn)行解碼的數(shù)據(jù)編碼方式,比如gzip 
?Accept-Language:瀏覽器所希望的語言種類岩四,當(dāng)服務(wù)器能夠提供一種以上的語言版本時(shí)要用到哭尝「缛粒可以在瀏覽器中進(jìn)行設(shè)置剖煌。 
?Host:初始URL中的主機(jī)和端口 
?Referer:包含一個(gè)URL材鹦,用戶從該URL代表的頁面出發(fā)訪問當(dāng)前請(qǐng)求的頁面 
?Content-Type:內(nèi)容類型 
?If-Modified-Since: Wed, 02 Feb 201112:04:56 GMT利用這個(gè)頭與服務(wù)器的文件進(jìn)行比對(duì),如果一致耕姊,則從緩存中直接讀取文件桶唐。 
?User-Agent:瀏覽器類型. 
?Content-Length:表示請(qǐng)求消息正文的長度 
?Connection:表示是否需要持久連接。如果服務(wù)器看到這里的值為“Keep -Alive”茉兰,或者看到請(qǐng)求使用的是HTTP 1.1(HTTP 1.1默認(rèn)進(jìn)行持久連接 
?Cookie:這是最重要的請(qǐng)求頭信息之一 
?Date:Date: Mon, 22 Aug 2011 01:55:39 GMT請(qǐng)求時(shí)間GMT

10. 什么是wsgi?

WSGI(Web Server Gateway Interface尤泽,Web 服務(wù)器網(wǎng)關(guān)接口)則是Python語言中1所定義的Web服務(wù)器和Web應(yīng)用程序之間或框架之間的通用接口標(biāo)準(zhǔn)。
WSGI就是一座橋梁规脸,橋梁的一端稱為服務(wù)端或網(wǎng)關(guān)端坯约,另一端稱為應(yīng)用端或者框架端,WSGI的作用就是在協(xié)議之間進(jìn)行轉(zhuǎn)化莫鸭。WSGI將Web組件分成了三類:Web 服務(wù)器(WSGI Server)闹丐、Web中間件(WSGI Middleware)與Web應(yīng)用程序(WSGI Application)。
Web Server接收HTTP請(qǐng)求被因,封裝一系列環(huán)境變量卿拴,按照WSGI接口標(biāo)準(zhǔn)調(diào)用注冊的WSGI Application,最后將響應(yīng)返回給客戶端梨与。

11. Flask框架依賴組件?

Route(路由)
templates(模板)
Models(orm模型)
blueprint(藍(lán)圖)
Jinja2模板引擎

12. Flask藍(lán)圖的作用?

藍(lán)圖Blueprint實(shí)現(xiàn)模塊化的應(yīng)用

book_bp = Blueprint(‘book’, name)創(chuàng)建藍(lán)圖對(duì)象

藍(lán)圖中使用路由@book_bp.route(‘url’) 
在另一.py文件里導(dǎo)入和注冊藍(lán)圖

from book import book_bp app.register_blueprint(book_bp)

作用

將不同的功能模塊化
構(gòu)建大型應(yīng)用
優(yōu)化項(xiàng)目結(jié)構(gòu)
增強(qiáng)可讀性,易于維護(hù)(跟Django的view功能相似)

13. 列舉使用過的Flask第三方組件?

flask_bootstrap
flask-WTF
flask_sqlalchemy

14. 簡述Flask上下文管理流程?

每次有請(qǐng)求過來的時(shí)候堕花,flask 會(huì)先創(chuàng)建當(dāng)前線程或者進(jìn)程需要處理的兩個(gè)重要上下文對(duì)象,把它們保存到隔離的棧里面粥鞋,這樣視圖函數(shù)進(jìn)行處理的時(shí)候就能直接從棧上獲取這些信息缘挽。

15. Flask中多app應(yīng)用是怎么完成?

請(qǐng)求進(jìn)來時(shí),可以根據(jù)URL的不同陷虎,交給不同的APP處理

17. wtforms組件的作用?

WTForms是一個(gè)支持多個(gè)web框架的form組件到踏,主要用于對(duì)用戶請(qǐng)求數(shù)據(jù)進(jìn)行驗(yàn)證。

18. Flask框架默認(rèn)session處理機(jī)制?

Flask的默認(rèn)session利用了Werkzeug的SecureCookie尚猿,把信息做序列化(pickle)后編碼(base64)窝稿,放到cookie里了。
過期時(shí)間是通過cookie的過期時(shí)間實(shí)現(xiàn)的凿掂。
為了防止cookie內(nèi)容被篡改伴榔,session會(huì)自動(dòng)打上一個(gè)叫session的hash串,這個(gè)串是經(jīng)過session內(nèi)容庄萎、SECRET_KEY計(jì)算出來的踪少,看得出,這種設(shè)計(jì)雖然不能保證session里的內(nèi)容不泄露糠涛,但至少防止了不被篡改援奢。

19. ORM的實(shí)現(xiàn)原理?

概念: 對(duì)象關(guān)系映射(Object Relational Mapping,簡稱ORM忍捡,或O/RM集漾,或O/R mapping)切黔,是一種程序技術(shù),用于實(shí)現(xiàn)面向?qū)ο缶幊陶Z言里不同類型系統(tǒng)的數(shù)據(jù)之間的轉(zhuǎn)換具篇。

詳細(xì)介紹:讓我們從O/R開始纬霞。字母O起源于”對(duì)象”(Object),而R則來自于”關(guān)系”(Relational)。幾乎所有的程序里面驱显,都存在對(duì)象和關(guān)系數(shù)據(jù)庫诗芜。在業(yè)務(wù)邏輯層和用戶界面層中,我們是面向?qū)ο蟮陌R摺.?dāng)對(duì)象信息發(fā)生變化的時(shí)候伏恐,我們需要把對(duì)象的信息保存在關(guān)系數(shù)據(jù)庫中。

當(dāng)你開發(fā)一個(gè)應(yīng)用程序的時(shí)候(不使用O/R Mapping),你可能會(huì)寫不少數(shù)據(jù)訪問層的代碼栓霜,用來從數(shù)據(jù)庫保存脐湾,刪除,讀取對(duì)象信息叙淌,等等狸捕。你在DAL中寫了很多的方法來讀取對(duì)象數(shù)據(jù)虽抄,改變狀態(tài)對(duì)象等等任務(wù)奔穿。而這些代碼寫起來總是重復(fù)的磷瘤。

ORM解決的主要問題是對(duì)象關(guān)系的映射。域模型和關(guān)系模型分別是建立在概念模型的基礎(chǔ)上的茂洒。域模型是面向?qū)ο蟮拿系海P(guān)系模型是面向關(guān)系的。一般情況下督勺,一個(gè)持久化類和一個(gè)表對(duì)應(yīng)渠羞,類的每個(gè)實(shí)例對(duì)應(yīng)表中的一條記錄,類的每個(gè)屬性對(duì)應(yīng)表的每個(gè)字段智哀。

20. ORM技術(shù)特點(diǎn)

1.提高了開發(fā)效率次询。由于ORM可以自動(dòng)對(duì)Entity對(duì)象與數(shù)據(jù)庫中的Table進(jìn)行字段與屬性的映射,所以我們實(shí)際可能已經(jīng)不需要一個(gè)專用的瓷叫、龐大的數(shù)據(jù)訪問層屯吊。
2.ORM提供了對(duì)數(shù)據(jù)庫的映射,不用sql直接編碼摹菠,能夠像操作對(duì)象一樣從數(shù)據(jù)庫獲取數(shù)據(jù)盒卸。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市次氨,隨后出現(xiàn)的幾起案子蔽介,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,185評(píng)論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件虹蓄,死亡現(xiàn)場離奇詭異谷朝,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)武花,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,652評(píng)論 3 393
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來杈帐,“玉大人体箕,你說我怎么就攤上這事√敉” “怎么了累铅?”我有些...
    開封第一講書人閱讀 163,524評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長站叼。 經(jīng)常有香客問我娃兽,道長,這世上最難降的妖魔是什么尽楔? 我笑而不...
    開封第一講書人閱讀 58,339評(píng)論 1 293
  • 正文 為了忘掉前任投储,我火速辦了婚禮,結(jié)果婚禮上阔馋,老公的妹妹穿的比我還像新娘玛荞。我一直安慰自己,他們只是感情好呕寝,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,387評(píng)論 6 391
  • 文/花漫 我一把揭開白布勋眯。 她就那樣靜靜地躺著,像睡著了一般下梢。 火紅的嫁衣襯著肌膚如雪客蹋。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,287評(píng)論 1 301
  • 那天孽江,我揣著相機(jī)與錄音讶坯,去河邊找鬼。 笑死岗屏,一個(gè)胖子當(dāng)著我的面吹牛闽巩,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播担汤,決...
    沈念sama閱讀 40,130評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼涎跨,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了崭歧?” 一聲冷哼從身側(cè)響起隅很,我...
    開封第一講書人閱讀 38,985評(píng)論 0 275
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后叔营,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體屋彪,經(jīng)...
    沈念sama閱讀 45,420評(píng)論 1 313
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,617評(píng)論 3 334
  • 正文 我和宋清朗相戀三年绒尊,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了畜挥。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,779評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡婴谱,死狀恐怖蟹但,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情谭羔,我是刑警寧澤华糖,帶...
    沈念sama閱讀 35,477評(píng)論 5 345
  • 正文 年R本政府宣布,位于F島的核電站瘟裸,受9級(jí)特大地震影響客叉,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜话告,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,088評(píng)論 3 328
  • 文/蒙蒙 一兼搏、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧沙郭,春花似錦向族、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,716評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至氧苍,卻和暖如春夜矗,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背让虐。 一陣腳步聲響...
    開封第一講書人閱讀 32,857評(píng)論 1 269
  • 我被黑心中介騙來泰國打工紊撕, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人赡突。 一個(gè)月前我還...
    沈念sama閱讀 47,876評(píng)論 2 370
  • 正文 我出身青樓对扶,卻偏偏與公主長得像,于是被迫代替她去往敵國和親惭缰。 傳聞我的和親對(duì)象是個(gè)殘疾皇子浪南,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,700評(píng)論 2 354