1. 程式人生 > 其它 >flask 返回json_TechRepo | Flask技術分享

flask 返回json_TechRepo | Flask技術分享

技術標籤:flask 返回json

TechRepo是由軟體學院學生科協推出的技術分享系列推送,每週會進行一次更新,旨在為同學們提供一個分享技術、學習技術、傳承技術的平臺。歡迎感興趣的同學關注我們,也歡迎有意向分享技術的同學聯絡我們([email protected])瞭解投稿事宜。

46cf3b90b61bfc77a15abcc8f6a923de.png

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_ENVFLASK_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基本知識和應用

321187150f3d797af84f5decef3b2bb0.png