概念
與jango(完善完整高集成的框架)不同的是,
flask是'微'框架(不包含數據庫抽象層框架,database,templates需要自己去組裝)
安裝
最簡單的方式就是 virtualenv(需要一個Python2.6或更高的版本)
1. 創建虛擬環境
virtualenv --no-site-packages flaskenv
cd claskenv
cd Scripts
activate
2.安裝flask
pip install flask
3.運行flask
python xxxx.py --> 啓動默認127.0.0.1:5000
- 一個最小的Flask文件:
from flask import Flask # 導入類Flask
app = Flask(__name__) # 初始化,__name__ 代表主模塊名或則包
# 路由/裝飾器,把一個函數綁定到一個 URL 上
@app.route('/')
def hello_world():
return 'Hello World!' # 視圖函數
if __name__ == '__main__':
app.run() # 啓動項目
注意: 文件保存名不能爲flask.py,否則會與Flask本身衝突
4.運行參數
app.run(port='8000', host='0.0.0.0')
# port指定端口爲8000,host主機ip地址0.0.0.0
# 實際項目中不要使用 debug=True
5.修改啓動方式
pip install flask-script
python hello.py runserver -p 端口 -h ip地址 -d
調試模式
run() 方法適用於啓動一個本地開發服務器,但是需要在修改代碼後手動重啓服務器。 如果啓用了調試模式,在代碼修改的時候服務器能夠自動加載, 並且如果發生錯誤,它會提供一個有用的調試器。 方式1: app.debug = True app.run() 方式2: app.run(debug=True)
注意: 在實際項目應用中不要使用調試模式!
route規則
@app.route('/stu/<int:id>/')
def show_stu(id):
return 'stu %d' % id
int 整型
float 浮點數
strint 默認的字符串
path '/'也是當成字符串返回
uuid uuid類型
- urls兩種方式
# 第一種方式
@app.route('/stu/')
def stu():
return 'hello, stu'
# 第二種方式
@app.route('/world')
def world():
return 'hello, world'
第一種方式,url 後面有一個斜線
訪問一個結尾不帶斜線的 URL,Flask 會重定向到帶斜線的 URL
第二種方式的 URL 結尾不帶斜線
這時候訪問結尾帶斜線的 URL,會產生一個 404 “Not Found” 錯誤
通常我們使用第一種方式!
- 重定向
用 redirect() 函數重定向用戶到其他地方
from flask import redirect, url_for
@app.route('/')
def index():
return redirect(url_for('index'))
模板
from flask import render_template
@app.route('/hello/<name>')
def hello(name=None):
return render_template('hello.html', name=name)
- 基礎模板
{# base.html #}
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<script src="https://code.jquery.com/jquery-3.2.1.min.js"></script>
<title>
{% block title %} {% endblock %}
</title>
{% block extCSS %} {% endblock %}
</head>
<body>
{# {% block %} 標籤定義了四個子模板可以重載的塊 #}
{% block nav %} {% endblock %}
{% block content %} {% endblock %}
{% block footer %} {% endblock %}
{% block extJS %} {% endblock %}
</body>
</html>
- 子模板1
{# base_main.html #}
{# {% extends %}標籤必須是子模板中的第一個標籤,這裏表示子模板繼承了'base.html'模板 #}
{% extends 'base.html' %}
{% block extCSS %}
<link rel="stulesheet" href="{{ url_for('static', filename='css/home.css') }}">
{% endblock %}
- 子模板2
{# show_stu.html #}
{# 子模板2繼承了子模板1,同時也繼承了子模板1所繼承的基礎模板 #}
{% extends 'base_main.html' %}
{% block title %} 學生信息 {% endblock %}
{% block content %}
<ul>
{% for stu in stus %}
<li>
id: {{ stu.s_id }}
姓名: {{ stu.s_name }}
年齡: {{ stu.s_age }}
</li>
{% endfor %}
</ul>
{% endblock %}
HTTP方法
默認情況下,路由只會響應 GET 請求, 但是能夠通過給 route() 裝飾器提供 methods 參數來改變,eg:
@app.route('/login', methods=['GET', 'POST'])
# 'POST'也可以換成'PUT'
# 同 POST 類似,但是服務器可能觸發了多次存儲過程,多次覆蓋掉舊值
# 在傳輸過程中連接丟失的情況下,瀏覽器和服務器之間的系統可以安全地第二次接收請求,而不破壞其它東西
# POST 是不可能實現的,因爲它只會被觸發一次
def login():
if request.method == 'POST':
return render_template('create_stu.html')
else:
return render_template('index.html')
藍圖(blueprint)
– 管理url,規劃url
概念:在一個應用或者跨應用中構建應用組件以及支持通用模式。
記錄註冊到一個應用時的操作執行情況,當從一個端點到另一端分發請求和生成 URL 時,Flask 關聯視圖函數和藍圖
藍圖在Flask中的主要作用:
- 把一個應用分解成一系列的藍圖。一個項目能實例化一個應用, 初始化一些擴展,以及註冊一系列的藍圖
- 以一個 URL 前綴 / 子域在一個應用上註冊藍圖。 URL 前綴 / 子域名中的參數即成爲這個藍圖下的所有視圖函數的共同的視圖參數(默認情況下)
- 在一個應用中用不同的 URL 規則多次註冊一個藍圖
- 通過藍圖提供模板過濾器、靜態文件、模板和其它功能。一個藍圖不一定要實現應用或視圖函數
- 初始化一個 Flask 擴展時,在這些情況中註冊藍圖
1.安裝
pip install flask-blueprint
2.初始化
from flask import Blueprint
blue = Blueprint('first', __name__)
# 修改
@app.route('/')
def hello_world():
return 'Hello World!'
# 爲
@blue.route('/')
def hello_world():
return 'Hello World!'
3.路由註冊
from flask import Flask
def create_app():
app = Flask(__name__)
app.register_blueprint(blueprint=blue)
return app
- 靜態文件
一個藍圖可以通過 static_folder 關鍵字參數提供一個指向文件系統上文件夾的路 徑,來公開一個帶有靜態文件的文件夾。這可以是一個絕對路徑,也可以是相對於藍圖文件夾的路徑:
admin = Blueprint('admin', __name__, static_folder='static')
# 藍圖爲 /admin 把靜態文件夾註冊到 /admin/static
命名的 blueprint_name.static ,生成它的 URL
url_for('admin.static', filename='style.css')
- 模板
用 Blueprint 構造函數中的 template_folder 參數來實現藍圖公開模板
admin = Blueprint('admin', __name__, template_folder='templates')
藍圖前綴
url_prefix=‘hello’
閱讀參考:Flask官方教程中文翻譯