本清單對 Flask 的入門進行了簡要的概述,以及其常用示例。需要有 HTML
和 Python
基礎。
# 導入 Flask 類
from flask import Flask
# 創建應用實例
app = Flask(__name__) # 'Flask' 參數是 應用程序模塊 或 包 的名稱
# __name__是適用于大多數情況的便捷快捷方式
# 路由 (裝飾器)
@app.route('/') # route()裝飾器告訴 Flask 什么路徑觸發下面的功能
def hello():
# 該函數返回我們想要在瀏覽器中顯示的消息內容
return 'Hello World!'
# 默認類型 HTML, 因此字符串中的 HTML 將被瀏覽器渲染
# 啟動服務
if __name__ == '__main__':
app.run()
hello.py
程序$ python hello.py
* Serving Flask app 'hello'
* Running on //127.0.0.1:5000
* Press CTRL+C to quit
$ flask --app hello run
* Serving Flask app 'hello'
* Running on //127.0.0.1:5000
* Press CTRL+C to quit
$ flask run --host=0.0.0.0
啟用調試模式,使用 --debug
選項
$ flask --app hello --debug run
from markupsafe import escape
@app.route("/<name>")
def hello(name):
return f"Hello, {escape(name)}!"
@app.route('/')
def index():
return 'Index Page'
@app.route('/hello')
def hello():
return 'Hello, World'
from markupsafe import escape
@app.route('/user/<username>')
def show_user_profile(username):
# 顯示該用戶的用戶個人資料
return f'User {escape(username)}'
@app.route('/post/<int:post_id>')
def show_post(post_id):
# 顯示給定id的帖子,id是一個整數
return f'Post {post_id}'
@app.route('/path/<path:subpath>')
def show_subpath(subpath):
# 在 /path/ 之后顯示子路徑
return f'Subpath {escape(subpath)}'
轉換器類型:
:-- | -- |
---|---|
string | (默認)接受任何沒有斜杠的文本 |
int | 接受正整數 |
float | 接受正浮點值 |
path | 像字符串但也接受斜線 |
uuid | 接受 UUID 字符串 |
@app.route('/projects/')
def projects():
return 'The project page'
@app.route('/about')
def about():
return 'The about page'
項目端點的規范 URL
有一個尾部斜杠。它類似于文件系統中的文件夾。如果您訪問沒有尾部斜杠 (/projects
) 的 URL
,Flask
會將您重定向到帶有尾部斜杠 (/projects/
) 的規范 URL
from flask import url_for
@app.route('/')
def index():
return 'index'
@app.route('/login')
def login():
return 'login'
@app.route('/user/<username>')
def profile(username):
return f'{username}\'s profile'
with app.test_request_context():
print(url_for('index'))
print(url_for('login'))
print(url_for('login', next='/'))
print(url_for('profile', username='John Doe'))
默認路由僅響應 GET
請求。可以使用 route()
裝飾器的方法參數來處理不同的 HTTP
方法
from flask import request
@app.route('/login',methods=['GET','POST'])
def login():
if request.method == 'POST':
return do_the_login()
else:
return show_the_login_form()
您還可以將不同方法的視圖分成不同的函數。 Flask
為每個常見的 HTTP
方法提供了一種快捷方式,用于使用 get()
、post()
等來裝飾此類路由
@app.get('/login')
def login_get():
return show_the_login_form()
@app.post('/login')
def login_post():
return do_the_login()
創建藍圖Bp1
from flask import Blueprint, abort, jsonify
# 定義Bp1,并定義url前綴為/img
Bp1 = Blueprint('imgBlue', __name__, template_folder='templates', url_prefix='/img')
@Bp1.route('/getimg')
def getImg():
try:
return jsonify(name="img", size="100KB")
except Exception as e:
abort(e)
創建藍圖Bp2
from flask import Blueprint, abort, jsonify
# 定義Bp2,并定義url前綴為/vedio
Bp2 = Blueprint('vedioBlue', __name__, template_folder='templates', url_prefix='/vedio')
@Bp2.route('/getvedio')
def getVedio():
try:
return jsonify(name="vedio", size="100GB")
except Exception as e:
abort(e)
在flask app中引用藍圖Bp1和Bp2
from flask import Flask, jsonify
from lantu.img import Bp1
from lantu.vedio import Bp2
app = Flask(__name__)
# 注冊藍圖到app
app.register_blueprint(Bp1)
app.register_blueprint(Bp2)
@app.route('/')
def index():
return jsonify(name='phyger')
if __name__ == '__main__':
app.run(host="127.0.0.1", debug=True)
簡單測試
curl //127.0.0.1:5000/
>> {"name":"phyger"}
curl //127.0.0.1:5000/img/getimg
>> {"name": "img", "size": "100KB"}
curl //127.0.0.1:5000/vedio/getvedio
>> {"name": "vedio", "size": "100GB"}