Hello Flask Flask簡介 Flask是一個使用Python編寫的輕量級Web應用框架。基於Werkzeug WSGI工具箱和Jinja2 模板引擎。Flask使用BSD授權。Flask被稱為“microframework”,因為它使用簡單的核心,用extension增加其他功能。Fla ...
Hello Flask
Flask簡介
Flask是一個使用Python編寫的輕量級Web應用框架。基於Werkzeug WSGI工具箱和Jinja2 模板引擎。Flask使用BSD授權。
Flask被稱為“microframework”,因為它使用簡單的核心,用extension增加其他功能。Flask沒有預設使用的資料庫、窗體驗證工具。然而,Flask保留了擴增的彈性,可以用Flask-extension加入這些功能:ORM、窗體驗證工具、文件上傳、各種開放式身份驗證技術。
Flask英文翻譯為瓶子,燒瓶,與另一個web框架Bottle同義,意在表示另一種容器,另一個框架。而且他們兩個也有一些相似的地方。
第一個Flask程式
from flask import Flask
app = Flask(__name__)
@app.route('/')
def index():
return '<h1>Hello,Flask<h1/>'
app.run('127.0.0.1',8000)
運行後可見控制台輸出:
- Serving Flask app “hello” (lazy loading)
- Environment: production
WARNING: Do not use the development server in a production environment.
Use a production WSGI server instead.- Debug mode: off
- Running on http://127.0.0.1:8000/ (Press CTRL+C to quit)
URL路由
Flask路由採用裝飾器的方式
@app.route('/')
def index():
綁定多個路由
@app.route('/index')
@app.route('/')
def index():
動態路由
@app.route('/index/<name>')
def index(name):
name會作為參數傳入視圖函數
也可以為參數設置預設值:
@app.route('/index',defaults={'name':'sfencs'})
@app.route('/index/<name>')
def index(name):
它其實相當於
@app.route('/index')
@app.route('/index/<name>')
def index(name='sfencs'):
還可以指定參數的類型:
@app.route('/index/<int:num>')
def index(num):
這樣路由只會匹配index後是數值類型參數的url,並且還會把num轉換為int型
除了int之外還有path,string,float,any,uuid等
指定請求方式的路由
@app.route('/index/<int:num>',methods=['get'])
def index(num):
method參數是一個列表
使用url_for()獲取url
當視圖函數綁定的路由發送改變時,我們可能在其他使用該路徑的地方一個一個手動修改,這種硬編碼的方式降低了代碼的易用性,這種情況可以使用url_for()函數來獲取url
url_for()函數的參數為視圖函數名
例如
@app.route('/index')
def aaa():
那麼url_for(’aaa‘)就是’/index’
當然如果是有參數的路由,那麼需要在url_for()函數中傳入參數
例如
@app.route('/index/<int:num>')
def aaa(num):
url_for函數就應該寫為:url_for(‘aaa’,num=123)
url_for()函數預設生成的是相對URL,要想生成絕對URL需要加入參數_external=True
http請求與響應
請求
如何在視圖函數中獲取請求,首先需要引入request對象
from flask import Flask,request
在視圖函數中可以直接通過request獲得屬性或方法
舉個簡單的例子
@app.route('/index/<int:num>',methods=['get'])
def index(num):
print(request.method)
print(request.args.get('name','sfencs'))
return '<h1>Hello,Flask<h1/>'
request中的方法和屬性未來都會對我們很有用,這裡就不一一介紹了。
響應
1.普通響應
return '<h1>Hello,Flask<h1/>'
return '<h1>Hello,Flask<h1/>',200 #可以設置狀態碼
2.重定向
return redirect(url_for('index'))
3.錯誤響應
abort(404)
abort()函數直接返回錯誤響應,後面的代碼不再執行
4.返迴響應對象
response = make_response('<h1>Hello,Flask<h1/>')
response.mimetype = 'text/html'
return response
通過設置mimetype可以返回不同類型的數據,常用的有純文本,html,xml,json
返回json格式數據時Flask提供一種更簡潔的方式
return jsonify({'name':'sfencs'})
這一個東西把生成response對象,設置數據類型,json序列化都做完了。
請求鉤子
請求鉤子是在視圖函數處理請求的前或者後的階段進行的處理函數
Flask預設實現的五種請求鉤子:
- before_first_request 處理第一個請求之前
- before_request 處理請求之前
- after_request 處理請求之後
- after_this_request 在視圖函數內註冊一個函數,會在這個請求結束後運行
- teardown_request 在請求結束後,如果有異常也會執行的鉤子,它在所有鉤子中最後一個執行,需要傳入異常對象
鉤子通過裝飾器註冊,比如
@app.before_request
def func():
pass
after_request和after_this_request的鉤子必須接受一個響應類對象做參數,最後並將其返回
配置變數
Flask中,配置變數通過Flask對象的config屬性配置與獲取
在Flask對象的源碼中看到config中已經存儲了很多預設值
default_config = ImmutableDict({
'ENV': None,
'DEBUG': None,
'TESTING': False,
'PROPAGATE_EXCEPTIONS': None,
'PRESERVE_CONTEXT_ON_EXCEPTION': None,
'SECRET_KEY': None,
'PERMANENT_SESSION_LIFETIME': timedelta(days=31),
'USE_X_SENDFILE': False,
'SERVER_NAME': None,
'APPLICATION_ROOT': '/',
'SESSION_COOKIE_NAME': 'session',
'SESSION_COOKIE_DOMAIN': None,
'SESSION_COOKIE_PATH': None,
'SESSION_COOKIE_HTTPONLY': True,
'SESSION_COOKIE_SECURE': False,
'SESSION_COOKIE_SAMESITE': None,
'SESSION_REFRESH_EACH_REQUEST': True,
'MAX_CONTENT_LENGTH': None,
'SEND_FILE_MAX_AGE_DEFAULT': timedelta(hours=12),
'TRAP_BAD_REQUEST_ERRORS': None,
'TRAP_HTTP_EXCEPTIONS': False,
'EXPLAIN_TEMPLATE_LOADING': False,
'PREFERRED_URL_SCHEME': 'http',
'JSON_AS_ASCII': True,
'JSON_SORT_KEYS': True,
'JSONIFY_PRETTYPRINT_REGULAR': False,
'JSONIFY_MIMETYPE': 'application/json',
'TEMPLATES_AUTO_RELOAD': None,
'MAX_COOKIE_SIZE': 4093,
})
它其實是字典的子類,所以我們可以以字典的方式操作它
app.config['SWITCH'] = 'on'
print(app.config['SWITCH'])
也可以使用update方法一次添加多個配置
app.config.update(SWITCH_A=True,SWITCH_B=False)
最後要註意配置變數的名稱必須要大寫,小寫的變數不會被讀取
debug模式
如運行時控制台的輸出
- Debug mode: off
可知預設debug模式是關閉的,所以當訪問路徑的程式出現錯誤的時候頁面會顯示
若要開啟debug模式,可在run方法添加debug=True參數
app.run('127.0.0.1',8000,debug=True)
此時我們故意使程式出錯,即將視圖函數多添加一個參數,再次訪問url,會出現
這個頁面對於我們調試錯誤非常有用,同時還允許我們在頁面上執行Python代碼,我們只需要點擊錯誤最右邊的命令行圖標
這時會彈出一個視窗讓我們輸入PIN碼,這個可以在程式剛允許時控制台輸出找到
輸入後就可在頁面執行代碼了
-
使用工廠模式解耦。 一、需求場景: 某一層功能需要改動,但其他層代碼不變 實現類1: 查詢自己的資料庫. ====改為==== 實現類2: 從其它地址得到數據. 二、步驟: 1.創建一個 類,Bean工廠 2.解決硬編碼問題,進一步優化解耦 提供一個配置文件: 內容: 三、理論 1.導入 使用介面開 ...
-
策略模式屬於對象的行為模式。其用意是針對一組演算法,將每一個演算法封裝到具有共同介面的獨立的類中,從而使得它們可以相互替換。策略模式使得演算法可以在不影響到客戶端的情況下發生變化。 策略模式的結構 策略模式是對演算法的包裝,是把使用演算法的責任和演算法本身分割開來,委派給不同的對象管理。策略模式通常把一個系列的 ...
-
作為一門面向對象的編程語言,Java認為一切皆是對象,每個對象都能歸屬於某個類,甚至每個類均可提取出一種特殊的類型,即Class類型。早在前面介紹多態的時候,就提到每個類都存在獨一無二的基因,通過比較實例的類基因與具體類名的類基因,即可分辨某個實例是否屬於目標類。例如,若想獲取公雞類的類型,則可通過 ...
-
近幾天,很多公眾號發佈了 Python 官方文檔的消息。然而,一個特別奇怪的現象就發生了,讓人啼笑皆非。 Python 文檔的中文翻譯工作一直是“默默無聞”,幾個月前,我還吐槽過這件事《再聊聊Python中文社區的翻譯》,當時我們的進度是 10.3%,遠遠落後於日本和法國,甚至落後於巴西! 這次所謂 ...
-
用python轉換jupyter成pdf 關註公眾號「**Python專欄**」,後臺回覆「**zsxq06**」,獲取本文全套源碼! ...
-
Java環境配置 1.JDK下載安裝 進入oracle官網選擇jdk下載(快捷鏈接:https://www.oracle.com/technetwork/java/javase/downloads/index.html) 選擇jdk版本(記住jdk的安裝路徑) 2.環境變數配置 右鍵我的電腦——點擊 ...
-
問題如圖 需要添加一個導入 這樣就不會報錯了 ...
-
Maven生成jar包時, 怎樣把項目中依賴的jar包也包括進去? 這裡介紹2種方式: 使用 shade插件, 和使用 assembly插件. 另外擴展Maven安裝本地jar包到本地倉庫的方法、手動生成jar包的方法、Linux下運行jar包的幾種方式. ...