Flask面試問題

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

Flask是一個Python編寫的Web微框架,讓我們可以使用Python語言快速實現一個網站或Web服務。

2. Django和Flask有什么區別?

Flask:

  • Flask確實很“輕”,Flask自由、靈活,可擴展性強,第三方庫的選擇面廣,開發時可以結合自己最喜歡用的輪子,也能結合最流行最強大的Python庫。
  • 入門簡單,非常適用于小型網站和開發web服務的API
  • 開發大型網站無壓力,但代碼架構需要自己設計,開發成本取決于開發者的能力
  • 各方面性能均等于或優于Django
  • Flask與關系型數據庫的配合使用不弱于Django,而其與NoSQL數據庫的配合遠遠優于Django
  • Flask比Django更加Pythonic,與Python的philosophy更加吻合
    Django:
  • 太重了,除了web框架,自帶ORM和模板引擎,靈活和自由度不夠高
  • 非常適合企業級網站的開發:快速、靠譜、穩定,但相比于Flask,Django的整體生態相對封閉
  • 自帶的數據庫管理app好評如潮
  • 自帶ORM也使Django與關系型數據庫耦合度過高,如果想使用MongoDB等NoSQL數據,需要選取合適的第三方庫,且總感覺Django+SQL才是天生一對的搭配,Django+NoSQL砍掉了Django的半壁江山。

3. Flask-WTF是什么,有什么特點?

Flask的簡單WTForms集成,包含CSRF、文件上傳和Recaptcha集成。
flask-wtf可以保護表單免受跨站請求偽造(CSRF)的攻擊,惡意網站將請求發送到被攻擊者已登錄的其他網站時就會引發CSRF。

form.html

 <form action="{{ url_for('wtf_form') }}" method='post'>
     {{ form.csrf_token }} #進入csrf驗證
     <p>{{ form.username.label }}{{ form.username(style='color:red',placeholder='請輸入用戶名') }}{{ 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   #導入繼承父類
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()  #實例化form對象
    if request.method == 'POST':
        if form.validate_on_submit():  #數據正確 并且驗證csrf通過
            print(request.form.get('userpass'))
            print(request.form.get('username'))
            return '數據提交成功'
    return render_template('wtf_form.html',form=form)

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

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

在shell中運行腳本文件
在python編譯器中run

5. 如何在Flask中訪問會話?

一個會話基本上允許記住從一個請求到另一個請求的信息。在Flask中,它使用簽名的cookie,以便用戶可以查看會話內容并進行修改。用戶可以修改會話,只要它有密鑰Flask.secret_key。
會話(seesion)會話數據存儲在服務器上。 會話是客戶端登錄到服務器并注銷的時間間隔。 需要在此會話中進行的數據存儲在服務器上的臨時目錄中。

from flask import session導入會話對象
session[‘name’] = ‘admin’給會話添加變量
session.pop(‘username’, None)刪除會話的變量

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

基本上,Flask是一個簡單的框架,其行為與MVC框架相同。所以MVC是Flask的完美選擇。

7. 解釋Python Flask中的數據庫連接?

python中的數據庫連接有兩種方式
在腳本中以用第三方庫正常連接,用sql語句正常操作數據庫,如mysql關系型數據庫的pymsql庫
用ORM來進行數據庫連接,flask中典型的flask_sqlalchemy,已面向對象的方式進行數據庫的連接與操作

8. 列舉Http請求中常見的請求方式?

1、opions 返回服務器針對特定資源所支持的HTML請求方法 或web服務器發送*測試服務器功能(允許客戶端查看服務器性能)
2、Get 向特定資源發出請求(請求指定頁面信息,并返回實體主體)
3、Post 向指定資源提交數據進行處理請求(提交表單、上傳文件),又可能導致新的資源的建立或原有資源的修改
4、Put 向指定資源位置上上傳其最新內容(從客戶端向服務器傳送的數據取代指定文檔的內容)
5、Head 與服務器索與get請求一致的相應,響應體不會返回,獲取包含在小消息頭中的原信息(與get請求類似,返回的響應中沒有具體內容,用于獲取報頭)
6、Delete 請求服務器刪除request-URL所標示的資源(請求服務器刪除頁面)
7、Trace 回顯服務器收到的請求,用于測試和診斷
8、Connect HTTP/1.1協議中能夠將連接改為管道方式的代理服務器

9. 列舉Http請求中常見的請求頭?

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

10. 什么是wsgi?

WSGI(Web Server Gateway Interface,Web 服務器網關接口)則是Python語言中1所定義的Web服務器和Web應用程序之間或框架之間的通用接口標準。
WSGI就是一座橋梁,橋梁的一端稱為服務端或網關端,另一端稱為應用端或者框架端,WSGI的作用就是在協議之間進行轉化。WSGI將Web組件分成了三類:Web 服務器(WSGI Server)、Web中間件(WSGI Middleware)與Web應用程序(WSGI Application)。
Web Server接收HTTP請求,封裝一系列環境變量,按照WSGI接口標準調用注冊的WSGI Application,最后將響應返回給客戶端。

11. Flask框架依賴組件?

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

12. Flask藍圖的作用?

藍圖Blueprint實現模塊化的應用

book_bp = Blueprint(‘book’, name)創建藍圖對象

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

from book import book_bp app.register_blueprint(book_bp)

作用

將不同的功能模塊化
構建大型應用
優化項目結構
增強可讀性,易于維護(跟Django的view功能相似)

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

flask_bootstrap
flask-WTF
flask_sqlalchemy

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

每次有請求過來的時候,flask 會先創建當前線程或者進程需要處理的兩個重要上下文對象,把它們保存到隔離的棧里面,這樣視圖函數進行處理的時候就能直接從棧上獲取這些信息。

15. Flask中多app應用是怎么完成?

請求進來時,可以根據URL的不同,交給不同的APP處理

17. wtforms組件的作用?

WTForms是一個支持多個web框架的form組件,主要用于對用戶請求數據進行驗證。

18. Flask框架默認session處理機制?

Flask的默認session利用了Werkzeug的SecureCookie,把信息做序列化(pickle)后編碼(base64),放到cookie里了。
過期時間是通過cookie的過期時間實現的。
為了防止cookie內容被篡改,session會自動打上一個叫session的hash串,這個串是經過session內容、SECRET_KEY計算出來的,看得出,這種設計雖然不能保證session里的內容不泄露,但至少防止了不被篡改。

19. ORM的實現原理?

概念: 對象關系映射(Object Relational Mapping,簡稱ORM,或O/RM,或O/R mapping),是一種程序技術,用于實現面向對象編程語言里不同類型系統的數據之間的轉換。

詳細介紹:讓我們從O/R開始。字母O起源于”對象”(Object),而R則來自于”關系”(Relational)。幾乎所有的程序里面,都存在對象和關系數據庫。在業務邏輯層和用戶界面層中,我們是面向對象的。當對象信息發生變化的時候,我們需要把對象的信息保存在關系數據庫中。

當你開發一個應用程序的時候(不使用O/R Mapping),你可能會寫不少數據訪問層的代碼,用來從數據庫保存,刪除,讀取對象信息,等等。你在DAL中寫了很多的方法來讀取對象數據,改變狀態對象等等任務。而這些代碼寫起來總是重復的。

ORM解決的主要問題是對象關系的映射。域模型和關系模型分別是建立在概念模型的基礎上的。域模型是面向對象的,而關系模型是面向關系的。一般情況下,一個持久化類和一個表對應,類的每個實例對應表中的一條記錄,類的每個屬性對應表的每個字段。

20. ORM技術特點

1.提高了開發效率。由于ORM可以自動對Entity對象與數據庫中的Table進行字段與屬性的映射,所以我們實際可能已經不需要一個專用的、龐大的數據訪問層。
2.ORM提供了對數據庫的映射,不用sql直接編碼,能夠像操作對象一樣從數據庫獲取數據。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 227,663評論 6 531
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,125評論 3 414
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 175,506評論 0 373
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,614評論 1 307
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,402評論 6 404
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 54,934評論 1 321
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,021評論 3 440
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,168評論 0 287
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,690評論 1 333
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,596評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,784評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,288評論 5 357
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,027評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,404評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,662評論 1 280
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,398評論 3 390
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,743評論 2 370