1. Why Flask?
- 官方文檔詳細,學習成本低,有利于項目其他成員迅速投入開發
- 框架輕,可擴展性高,且有很多好用的擴展(extension)
- 該框架仍在積極地維護和開發
2. 將要介紹到的Flask的擴展
- flask blueprint 用于注冊、管理路由
- flask_restful 用于支持構建REST APIs
- flask_migrate 用于管理數據庫版本遷移
- flask_sqlalchemy orm, 用于映射數據庫對象,提供數據操作方法
3. 項目結構
- project
- user
- helpers.py
- views.py
- migrations
- __init__.py
- blueprint.py
- bootstrap.py
- models.py
路徑 | 功能 |
---|---|
user/ | 資源或者模塊,此處為用戶模塊 |
migrations | 數據庫遷移文件 |
user/views.py | 處理對資源的請求(如GET,POST) |
user/helpers.py | 模塊涉及到的輔助函數 |
__init__.py
|
初始化Flask app |
blueprint.py | 路由 |
bootstrap.py | app的啟動 |
models.py | 數據庫實體的對象 |
4. 關鍵代碼
初始化Flask app
# __init__.py
from
flask
import
Flask
app
=
Flask
(
__name__
)
路由注冊
使用兩種包
- flask blueprint 普通的路由,一個函數對應于一個api請求
# user/views.py
@blueprint
.
route
(
'/password'
,
methods
=
[
'PUT'
]
)
def
update_password
(
)
:
form
=
request
.
get_json
(
True
,
True
)
user_id
=
auth_helper
(
)
new_pass
=
form
.
get
(
"password"
)
if
not
new_pass
:
return
jsonify
(
error
=
"密碼不能為空"
)
,
400
new_pass
=
encrypt_helper
(
new_pass
)
User
.
patch
(
user_id
=
user_id
,
password
=
new_pass
)
cookie
=
request
.
cookies
session_id
=
cookie
.
get
(
'fat-wallet'
)
session
.
pop
(
session_id
)
return
jsonify
(
data
=
"ok"
)
,
200
- flask_restful 單位為資源,支持GET, POST等http方法
# user/views.py
class
UserResource
(
Resource
)
:
def
get
(
self
)
:
student_id
=
request
.
args
.
get
(
"student_id"
)
username
=
request
.
args
.
get
(
"username"
)
offset
=
request
.
args
.
get
(
"offset"
)
limit
=
request
.
args
.
get
(
"limit"
)
users
=
User
.
get
(
student_id
=
student_id
,
username
=
username
,
offset
=
offset
,
limit
=
limit
)
result
=
[
{
"user_id"
:
user
.
id
,
"student_id"
:
user
.
student_id
,
"username"
:
user
.
username
,
"major"
:
user
.
major
,
"email"
:
user
.
email
,
"phone"
:
user
.
phone
,
"avatar"
:
user
.
avatar
.
decode
(
)
if
user
.
avatar
else
None
}
for
user
in
users
]
return
dict
(
data
=
result
,
count
=
len
(
result
)
)
,
200
為app注冊以上兩種路由
# blueprint.py
from
backend
.
user
.
views
import
blueprint
as
user_blueprint
from
backend
.
user
.
views
import
UserResource
def
setup
(
app
)
:
api
=
Api
(
app
)
app
.
register_blueprint
(
user_blueprint
,
url_prefix
=
'/users'
)
api
.
add_resource
(
UserResource
,
'/users/'
)
定義映射數據庫的對象,通過對象操作數據
# models.py
app
.
config
[
'SQLALCHEMY_DATABASE_URI'
]
=
'mysql+pymysql://root:admin@mysql/money'
db
=
SQLAlchemy
(
app
)
migrate
=
Migrate
(
app
,
db
)
class
MyMixin
(
object
)
:
__table_args__
=
{
'mysql_engine'
:
'InnoDB'
,
'mysql_charset'
:
'utf8mb4'
,
}
class
User
(
db
.
Model
,
MyMixin
)
:
__tablename__
=
'users'
id
=
db
.
Column
(
BIGINT
(
unsigned
=
True
)
,
primary_key
=
True
)
student_id
=
db
.
Column
(
db
.
String
(
10
)
,
unique
=
True
)
username
=
db
.
Column
(
db
.
String
(
20
)
,
unique
=
True
,
nullable
=
False
)
password
=
db
.
Column
(
db
.
String
(
40
)
,
nullable
=
False
)
major
=
db
.
Column
(
db
.
String
(
20
)
)
email
=
db
.
Column
(
db
.
String
(
30
)
,
unique
=
True
)
phone
=
db
.
Column
(
db
.
String
(
20
)
,
unique
=
True
)
avatar
=
db
.
Column
(
db
.
LargeBinary
(
2
**
21
-
1
)
)
# 2M
# 通過model操作數據
user
=
User
(
username
=
username
,
password
=
pass_md5
,
email
=
email
)
db
.
session
.
add
(
user
)
db
.
session
.
commit
(
)
使用flask_migrate管理數據的遷移
flask db init
# 初始化(生成migrations文件夾)
flask db migrate
-
m
"msg"
# 根據當前的model生成遷移文件, 可添加信息
flask db upgrade
id
# 根據生成的遷移文件更新數據庫表結構, id為指定的遷移版本,可以為head,表示最新的
flask db history
# 查看遷移歷史
運行項目
# debug mode
flask run
-
-
host
=
0.0
.0
.0
Github項目地址
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
