flask 返回json_TechRepo | Flask技術分享
技術標籤:flask 返回json
TechRepo是由軟體學院學生科協推出的技術分享系列推送,每週會進行一次更新,旨在為同學們提供一個分享技術、學習技術、傳承技術的平臺。歡迎感興趣的同學關注我們,也歡迎有意向分享技術的同學聯絡我們([email protected])瞭解投稿事宜。
Flask技術分享
Flask 是一個微型的 Python 開發的 Web 框架。它也被稱為“microframework”,因為它使用簡單的核心,沒有預設的資料庫、窗體驗證工具等功能。然而,Flask支援數量眾多且豐富的擴充套件,如ORM、窗體驗證工具、檔案上傳、各種開放式身份驗證技術等等。
建立應用
首先,我們可以通過建立一個Flask物件例項,來建立一個application
fromflaskimportFlask
app=Flask(__name__)
在flask中,所有應用都應該以一個python package的方式存在,因此我們應該在對應資料夾中新增__init__.py
檔案。在__init__py
檔案中,我們一般會定義create_app
函式,它是建立app例項,讀取相關配置的工廠函式,例如:
importos
fromflaskimportFlask
fromconfigimportconfig
defcreate_app(v="production"):
app=Flask(__name__)
config_name=os.getenv("FLASK_ENV")orv
app.config.from_object(config[config_name])
config[config_name].init_app(app)
#..............
#..............
然後,我們就可以通過flask run
命令來執行應用,該命令會預設為我們啟動一個本地伺服器:
#forwindowsuseexportwithLinuxandMacinsteadofset
>setFLASK_ENV=development
>setFLASK_APP=your_app_name
>flaskrun
我們也可以開啟一個互動式的Python shell,並將應用例項匯入:
>flaskshell
配置管理
在一個Flask物件中,我們可以通過config屬性來訪問該應用配置的值,其本質是一個字典:
app=Flask(__name__)
app.config['TESTING']=True
一般來說,我們會使用單獨的配置檔案來管理應用的配置,新建config.py
檔案,並在其中寫入相關的配置,推薦使用類和類的繼承來進行配置的管理和匯出:
classConfig(object):
DEBUG=False
TESTING=False
DATABASE_URI='sqlite:///:memory:'
#可以定義靜態方法,在載入配置時進行初始化操作
@staticmethod
definit_app(app):
pass
classProduction(Config):
DATABASE_URI='mysql://[email protected]/foo'
classDevelopment(Config):
DEBUG=True
classTesting(Config):
TESTING=True
config={
'development':Development,
'testing':TestConfig,
'production':ProductionConfig,
'default':Development
}
相應地,我們可以使用Flask物件的config.from_object
方法載入config:
fromconfigimportconfig
importos
config_name=os.getenv('FLASK_ENV')or'production'
app.config.from_object(config[config_name])
對於FLASK_ENV
和FLASK_DEBUG
這兩個動態影響應用執行模式的配置,我們一般使用環境變數。例如,在使用python-dotenv
時,我們可以在.env
檔案中寫入環境變數:
FLASK_APP=app
FLASK_ENV=development
路由處理與藍圖
Blueprint是Flask中組織一組檢視和程式碼的方式,我們可以將一組url和其對應的檢視函式註冊到藍圖上,為其提供相應的過濾器、靜態檔案等資源,再將藍圖註冊到應用上,來實現應用的分解和擴充套件。
我們可以這樣來建立一個藍圖並將其註冊到app上:
#app/api/__init__.py
fromflaskimportBlueprint
api=Blueprint('api',__name__)
#app/__init__.py
defcreate_app()
#......from.importapiasapi_bpapp.register_blueprint(api_bp,url_prefix='/api')
而在藍圖下,我們可以使用@bp_name.route
來匹配一個藍圖下的url和其處理函式,例如:
@api.route('/register',methods=('GET','POST'))
defregister():
ifrequest.method=='POST':
#......
else:
#......
#匹配url具有幾種不同的模式
#例如,帶路徑引數時可以類似寫成'/users/'的形式
flask會根據當前的請求上下文將一個request
物件傳入函式之中,我們可以通過其屬性訪問到對應的請求資料,例如:request.method
,request.json
,request.args
等。
flask會自動對路由函式的返回值通過Response
物件封裝,返回一個請求的響應,例如以下程式碼就會將一個以json格式返回一個響應:
returnjsonify({'error':'BadRequest'}),401
資料庫的使用
一般來說,我們會使用ORM來管理資料庫,這裡我們使用的是flask-sqlalchemy
,它的語法基本繼承於sqlalchemy
。
fromflask-sqlalchemyimportSQLAlchemy
db=SQLAlchemy()
defcreate_app():
#......
#flask的擴充套件的一般方法,通過建立init_app方法來進行和自定義初始化
db.init_app(app)
注意,我們還需要修改配置檔案,配置資料庫相關資訊,特別是在使用預設的sqlite以外的資料庫時。
之後,我們可以建立models.py
檔案,並在其中定義資料庫模型,例如:
classUser(db.Model):
__tablename__="users"
#使用db.Column生成一個欄位db.Integer等對應其資料形式
id=db.Column(db.Integer,primary_key=True,autoincrement=True)
name=db.Column(db.String(50),nullable=False)
在使用外來鍵時,我們可以通過sqlalchemy提供的relationship
來直接訪問外來鍵對應的ORM物件,例如下面是一個一對多關係的示例:
classUser(db.Model):
#......
items=db.relationship('Item',backref='owner',lazy='dynamic',cascade="all,delete")
classItem(db.Model):
#......
owner_id=db.Column(db.Integer,db.ForeignKey('users.id'))
我們同樣可以使用db.session
建立一個會話,並在會話內訪問資料庫,進行增刪改查,例如:
#增
db.session.add(User(username,password))
db.session.commit()
#查
user=User.query.filter_by(id=id).first()#也可以使用db.session.query
#改
user.username='new'
db.session.commit()
#刪
db.session.delete(user)#或User.query.filter_by(id=id).delete()
db.session.commit()
在實際的應用中,我們需要使用資料庫的遷移,我們可以使用flask_migrate
外掛來實現:
fromflask_migrateimportMigrate
migrate=Migrate()
migrate.init_app(app,db,render_as_batch=True)
在命令列中,對應的使用以下命令進行資料庫的初始化、migrate和upgrade。
>flaskdbinit
>flaskdbmigrate-m'comment'
>flaskdbupgrade
文案:張智
排版:趙乙寧
往期推送速覽
1
TechRepo | Linux命令列介紹
2
TechRepo | Why HTTPS
3
TechRepo | 正則表示式
4
TechRepo | 微信小程式入門
5
TechRepo | OpenCV-Python簡單入門
6
TechRepo | LaTex基本知識和應用