Flask面試題常問
1,什麽是Flask,有什麽優點?
概念解釋
Flask是一個Web框架,就是提供一個工具,庫和技術來允許你構建一個Web應用程序。這個Web應用程序可以是一些Web頁面,博客,wiki,基於Web的日裏應用或商業網站。
優點
Flask屬於微框架(micro-framework)這一類別,微架構通常是很小的不依賴外部庫的框架。
- 框架很輕量
- 更新時依賴小
- 專註於安全方面的bug
Flask的依賴
- Werkzeug 一個WSGI工具包(web服務網關接口(Python Web Server Gateway Interface,縮寫為WSGI)是為python語言定義的web服務器和web應用程序或框架之間的一種簡單而通用的借口,其他語言也有類似的接口)
- jinja2模板引擎
2,Django和Flask有什麽區別?
Flask
- 輕量級web框架,默認依賴兩個外部庫:jinja2和Werkzeug WSGI工具
- 適用於做小型網站以及web服務的API,開發大型網站無壓力,但架構需要自己設計
- 與關系型數據庫的結合不弱於Django,而與非關系型數據庫的結合遠遠優於Django
Django
- 重量級web框架,功能齊全,提供一站式解決的思路,能讓開發者不用在選擇上花費大量時間。
- 自帶ORM(Object-Relational Mapping 對象關系映射)和模板引擎,支持jinja等非官方模板引擎。
- 自帶ORM使Django和關系型數據庫耦合度高,如果要使用非關系型數據庫,需要使用第三方庫
- 自帶數據庫管理app
- 成熟,穩定,開發效率高,相對於Flask,Django的整體封閉性比較好,適合做企業級網站的開發。
- python web框架的先驅,第三方庫豐富
3,Flask-WTF是什麽,有什麽特點?
- Flask-wtf是一個用於表單處理,校驗並提供csrf驗證的功能的擴展庫
- Flask-wtf能把正表單免受CSRF<跨站請求偽造>的攻擊
- Flask-WTF 提供 FileField 來處理文件上傳,它在表單提交後,自動從 flask.request.files 中抽取數據。FileField 的 data 屬性是一個 Werkzeug 。
eg:
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中訪問會話?
- 會話(seesion)會話數據存儲在服務器上。 會話是客戶端登錄到服務器並註銷的時間間隔。 需要在此會話中進行的數據存儲在服務器上的臨時目錄中。
from flask import session
導入會話對象session[‘name‘] = ‘admin‘
給會話添加變量,也可以使用session.get(‘name’)獲取值。session.pop(‘username‘, None)
刪除會話的變量
6,Flask是一個MVC模型嗎?如果是,可以示例一下嗎?
- flask是一個典型的MVC框架
- MVC框架,圖形理解
- flask項目中的MVC理解
7, 解釋Python Flask中的數據庫連接?
python中的數據庫連接有兩種方式
- 在腳本中以用第三方庫正常連接,用sql語句正常操作數據庫,如mysql關系型數據庫的pymsql庫
- 用ORM來進行數據庫連接,flask中典型的flask_sqlalchemy,已面向對象的方式進行數據庫的連接與操作
8,談談restful?
REST是一種Web架構風格,它有六條準則:
1.客戶端-服務端(Client-Server)
2.無狀態(Stateless)
3.可緩存(Cachable)
4.分層系統(Layered System)
5.統一接口(Uniform Interface)
6.支持按需代碼(Code-on-Demand,可選)
只要滿足以上六條準則的Web架構可以說是Restful的。
RESTful規範
9. 列舉Http請求中常見的請求方式?
GET / POST/DELETE
10. 列舉Http請求中的狀態碼?
- 404 請求的url地址不存在
- 503 訪問限制有權限
- 200 訪問成功
- 302 重定向
-
1xx —— 元數據 2xx —— 正確的響應 3xx —— 重定向 4xx —— 客戶端錯誤 5xx —— 服務端錯誤 100 Continue。客戶端應當繼續發送請求。 200 OK。請求已成功,請求所希望的響應頭或數據體將隨此響應返回。 201 Created。請求成功,並且服務器創建了新的資源。 301 Moved Permanently。請求的網頁已永久移動到新位置。 服務器返回此響應(對GET或HEAD請求的響應)時,會自動將請求者轉到新位置。 302 Found。服務器目前從不同位置的網頁響應請求,但請求者應繼續使用原有位置來進行以後的請求。 400 Bad Request。服務器不理解請求的語法。 401 Unauthorized。請求要求身份驗證。對於需要登錄的網頁,服務器可能 返回此響應。 403 Forbidden。服務器拒絕請求。 404 Not Found。服務器找不到請求的網頁。 500 Internal Server Error。服務器遇到錯誤,無法完成請求。
11. 列舉Http請求中常見的請求頭?
- User-Agent:瀏覽器類型,如果Servlet返回的內容與瀏覽器類型有關則該值非常有用。
- Cookie:這是最重要的請求頭信息之一
- Content-Type:請求類型
12. 什麽是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,最後將響應返回給客戶端。
13. Flask框架依賴組件?
- Route(路由)
- templates(模板)
- Models(orm模型)
- blueprint(藍圖)
- Jinja2模板引擎
14. Flask藍圖的作用?
藍圖Blueprint實現模塊化的應用
- book_bp = Blueprint(‘book‘, __name__)
創建藍圖對象
- 藍圖中使用路由@book_bp.route(‘url‘)
- 在另一.py文件裏導入和註冊藍圖from book import book_bp
app.register_blueprint(book_bp)
作用
- 將不同的功能模塊化
- 構建大型應用
- 優化項目結構
- 增強可讀性,易於維護(跟Django的view功能相似)
15. 列舉使用過的Flask第三方組件?
- flask_bootstrap
- flask-WTF
- flask_sqlalchemy
16. 簡述Flask上下文管理流程?
每次有請求過來的時候,flask 會先創建當前線程或者進程需要處理的兩個重要上下文對象,把它們保存到隔離的棧裏面,這樣視圖函數進行處理的時候就能直接從棧上獲取這些信息。
17. Flask中多app應用是怎麽完成?
請求進來時,可以根據URL的不同,交給不同的APP處理
18. wtforms組件的作用?
WTForms是一個支持多個web框架的form組件,主要用於對用戶請求數據進行驗證。
19. Flask框架默認session處理機制?
Flask的默認session利用了Werkzeug的SecureCookie,把信息做序列化(pickle)後編碼(base64),放到cookie裏了。
過期時間是通過cookie的過期時間實現的。
為了防止cookie內容被篡改,session會自動打上一個叫session的hash串,這個串是經過session內容、SECRET_KEY計算出來的,看得出,這種設計雖然不能保證session裏的內容不泄露,但至少防止了不被篡改
20. ORM的實現原理?
概念: 對象關系映射(Object Relational Mapping,簡稱ORM,或O/RM,或O/R mapping),是一種程序技術,用於實現面向對象編程語言裏不同類型系統的數據之間的轉換。
詳細介紹: 讓我們從O/R開始。字母O起源於”對象”(Object),而R則來自於”關系”(Relational)。幾乎所有的程序裏面,都存在對象和關系數據庫。在業務邏輯層和用戶界面層中,我們是面向對象的。當對象信息發生變化的時候,我們需要把對象的信息保存在關系數據庫中。
當你開發一個應用程序的時候(不使用O/R Mapping),你可能會寫不少數據訪問層的代碼,用來從數據庫保存,刪除,讀取對象信息,等等。你在DAL中寫了很多的方法來讀取對象數據,改變狀態對象等等任務。而這些代碼寫起來總是重復的。
ORM解決的主要問題是對象關系的映射。域模型和關系模型分別是建立在概念模型的基礎上的。域模型是面向對象的,而關系模型是面向關系的。一般情況下,一個持久化類和一個表對應,類的每個實例對應表中的一條記錄,類的每個屬性對應表的每個字段。
ORM技術特點:
1.提高了開發效率。由於ORM可以自動對Entity對象與數據庫中的Table進行字段與屬性的映射,所以我們實際可能已經不需要一個專用的、龐大的數據訪問層。
2.ORM提供了對數據庫的映射,不用sql直接編碼,能夠像操作對象一樣從數據庫獲取數據。
Flask面試題常問