Python學習筆記——0003 用Flask寫簡易API(別版)

Tag:PyCharmFlask辫呻,flask_sqlalchemy镰禾,Flask-Restful

[TOC]

筆者使用PyCharm來進行開發(fā)操作酌泰。

另一篇使用的是Flask-Restless中的APIManager,本篇使用Flask-Restful中的API來實現(xiàn)斋扰。

一、在PyCharm中新建Flask項目

image

新建項目時啃洋,將會聯(lián)網(wǎng)(外網(wǎng))下載并安裝flask传货、jinja2等。如果有錯誤提示宏娄,請自行解決網(wǎng)絡(luò)問題损离。

二、在PyCharm中的終端绝编,下載所需的包

因為新建項目的時候使用了Virtualenv僻澎,所以安裝相關(guān)依賴貌踏,只需要在終端中,正常安裝就可以了窟勃。此時pip3安裝的包祖乳,都不是全局的,而只在當前虛擬環(huán)境中起作用秉氧。

pip3 install flask_sqlalchemy
pip3 install flask_restful
pip3 install flask-cors
pip3 install flask-restless
pip3 install flask-httpauth
pip3 install passlib

==此處和另一篇有不同眷昆。==

本例中,使用flask_sqlalchemyFlask-Restful

pip3 install flask_sqlalchemy
pip3 install flask_restful

關(guān)于virtualenv的相關(guān)信息汁咏,可以參考:virtualenv介紹及基本使用

image

三亚斋、導(dǎo)入包

在主文件上方,導(dǎo)入相關(guān)的包攘滩。

==此處和另一篇有不同帅刊。==

import os
from flask import Flask

from flask_sqlalchemy import SQLAlchemy
from flask_restful import Api,Resource
image

四、初始配置

# 創(chuàng)建Flask應(yīng)用
app = Flask(__name__)


# 獲取項目的基地址
basedir = os.path.abspath(os.path.dirname(__file__))


# 格式為mysql://{用戶名}:{密碼}@{host}:{端口}/{數(shù)據(jù)庫名}
app.config['SQLALCHEMY_DATABASE_URI']='mysql://root:@172.17.0.17:3307/flaskdb'

# 或者使用SQLite項目文件下的SQLite數(shù)據(jù)庫漂问。
# app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///' + os.path.join(basedir, 'SQL/testSQL.db')

#這個提示你設(shè)為true
app.config['SQLALCHEMY_TRACK_MODIFICATIONS']='true'

# 創(chuàng)建Flask-SQLAlchemy對象
db = SQLAlchemy(app)

這里使用SQLAlchemy來連接一個172.17.0.17上3307端口赖瞒,用戶名是root,密碼為空蚤假,數(shù)據(jù)庫名是flaskdb的MariaDB數(shù)據(jù)庫栏饮。

根據(jù)官方教程, Flask中常見Config用法有以下幾種。

  1. 直接賦值磷仰。
  2. 通過config的update方法一次更新多個屬性值袍嬉。
  3. 部分配置值可以通過屬性賦值。
  4. 通過文件讀取初始化config信息灶平。

關(guān)于config的部分冬竟,可以參考:讀Flask源代碼學習Python--config原理,這里不多加贅述民逼。

四泵殴、創(chuàng)建數(shù)據(jù)模型

創(chuàng)建Flask-SQLAlchemy模型(亦有成為bean的),但是要遵守下列兩點(合理)限制:
1.必須有一個主鍵類型是sqlalchemy.Integer或sqlalchemy.Unicode拼苍;
2.必須有init方法笑诅,用來初始化數(shù)據(jù)(flask_sqlalchemy.SQLAlchemy.Model已經(jīng)提供)。

==此處和另一篇有不同疮鲫。==

class Person(db.Model):
  id = db.Column(db.Integer, primary_key=True)
  name = db.Column(db.Unicode, unique=True)
  birth_date = db.Column(db.Date)
  # 要將這個Bean手動轉(zhuǎn)換為json
  def to_json(self):
      return {'id': self.id, 'name': self.name, 'birth_date': self.birth_date.strftime("%Y-%m-%d")}

class Computer(db.Model):
  id = db.Column(db.Integer, primary_key=True)
  name = db.Column(db.Unicode, unique=True)
  vendor = db.Column(db.Unicode)
  purchase_time = db.Column(db.DateTime)
  owner_id = db.Column(db.Integer, db.ForeignKey('person.id'))
  def to_json(self):
      return {'id': self.id, 'name': self.name, 'vendor': self.vendor, 'purchase_time': self.purchase_time.strftime("%Y-%m-%d %H:%M:%S"), 'owner_id': self.owner_id}

flask-sqlalchemy中的SQLAlchemy可以用orm處理數(shù)據(jù)庫吆你,告別繁瑣的sql語句。文檔鏈接:http://flask-sqlalchemy.pocoo.org/2.3/

五俊犯、創(chuàng)建api

根據(jù)數(shù)據(jù)模型妇多,創(chuàng)建對應(yīng)的api。

class personList(Resource):
    # get方法實現(xiàn)的內(nèi)容
    def get(self):
        person_list = []
        # 限制查詢10個
        persons = Person.query.limit(10).all()
        for n in persons:
            # 逐個轉(zhuǎn)化為json后添加進數(shù)組
            person_list.append(n.to_json())
        # 完善一下json
        return {"stories":person_list}

class computerList(Resource):
    # get方法實現(xiàn)的內(nèi)容
    def get(self):
        computer_list = []
        # 限制查詢10個
        computers = Computer.query.limit(10).all()
        for n in computers:
            # 逐個轉(zhuǎn)化為json后添加進數(shù)組
            computer_list.append(n.to_json())
        # 完善一下json
        return {"stories":computer_list}



# 查詢person的api
api.add_resource(personList,'/api/person')
# 查詢computer的api
api.add_resource(computerList,'/api/computer')

更多關(guān)于Flask-Restless的內(nèi)容燕侠,請查閱官方文檔者祖,本文不在贅述立莉。文檔鏈接:https://flask-restless.readthedocs.io/en/latest/index.html

六、主程序入口

if __name__ == '__main__':
    app.run(host='0.0.0.0', port=6789)

在瀏覽器中輸入地址即ip加端口進行訪問驗證:

http://127.0.0.1:6789/api/person
http://127.0.0.1:6789/api/computer
或者
http://172.17.0.38:6789/api/person
http://172.17.0.38:6789/api/computer

此時應(yīng)該得到一個json的response七问。

得到兩個json

{
  "stories": [
    {
      "id": 1,
      "name": "tt01",
      "vendor": "dd",
      "purchase_time": "2018-08-20 11:58:17",
      "owner_id": 1
    },
    {
      "id": 2,
      "name": "tt02",
      "vendor": "33",
      "purchase_time": "2018-08-20 11:58:21",
      "owner_id": 2
    },
    {
      "id": 3,
      "name": "tt03",
      "vendor": "22",
      "purchase_time": "2018-08-20 11:58:12",
      "owner_id": 1
    }
  ]
}
{
  "stories": [
    {
      "id": 1,
      "name": "wolf",
      "birth_date": "2018-08-20"
    },
    {
      "id": 2,
      "name": "tst",
      "birth_date": "2018-08-20"
    }
  ]
}

七蜓耻、完整代碼

完整的flaskAPI.py代碼如下:

import os
from flask import Flask

from flask_sqlalchemy import SQLAlchemy
from flask_restful import Api, Resource


app = Flask(__name__)

'''
根據(jù)官方教程, Flask中常見Config用法有以下幾種。

    1.直接賦值械巡。
    2.通過config的update方法一次更新多個屬性值刹淌。
    3.部分配置值可以通過屬性賦值。
    4.通過文件讀取初始化config信息讥耗。
'''
# 獲取項目的基地址
basedir = os.path.abspath(os.path.dirname(__file__))

# 格式為mysql://{用戶名}:{密碼}@{host}:{端口}/{數(shù)據(jù)庫名}
# app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql://root:@172.17.0.17:3307/flaskdb'
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///' + os.path.join(basedir, 'SQL/testSQL.db')

# 這個提示你設(shè)為true
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = 'true'

# 創(chuàng)建Flask-SQLAlchemy對象
db = SQLAlchemy(app)

api = Api(app)

# 像往常一樣創(chuàng)建Flask-SQLAlchemy模型有勾,但是要遵守下列兩點(合理)限制:
#  1.必須有一個主鍵類型是sqlalchemy.Integer或sqlalchemy.Unicode。
#  2.必須有__init__方法古程,用來初始化數(shù)據(jù)(flask.ext.sqlalchemy.SQLAlchemy.Model已經(jīng)提供)蔼卡。


class Person(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.Unicode, unique=True)
    birth_date = db.Column(db.Date)

    # 要將這個Bean手動轉(zhuǎn)換為json
    def to_json(self):
        return {'id': self.id, 'name': self.name, 'birth_date': self.birth_date.strftime("%Y-%m-%d")}

class Computer(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.Unicode, unique=True)
    vendor = db.Column(db.Unicode)
    purchase_time = db.Column(db.DateTime)
    owner_id = db.Column(db.Integer, db.ForeignKey('person.id'))

    def to_json(self):
        return {'id': self.id, 'name': self.name, 'vendor': self.vendor,
                'purchase_time': self.purchase_time.strftime("%Y-%m-%d %H:%M:%S"), 'owner_id': self.owner_id}

class personList(Resource):
    # get方法實現(xiàn)的內(nèi)容
    def get(self):
        person_list = []
        # 限制查詢10個
        persons = Person.query.limit(10).all()
        for n in persons:
            # 逐個轉(zhuǎn)化為json后添加進數(shù)組
            person_list.append(n.to_json())
        # 完善一下json
        return {"stories": person_list}


class computerList(Resource):
    # get方法實現(xiàn)的內(nèi)容
    def get(self):
        computer_list = []
        # 限制查詢10個
        computers = Computer.query.limit(10).all()
        for n in computers:
            # 逐個轉(zhuǎn)化為json后添加進數(shù)組
            computer_list.append(n.to_json())
        # 完善一下json
        return {"stories": computer_list}


# 查詢person的api
api.add_resource(personList, '/api/person')
# 查詢computer的api
api.add_resource(computerList, '/api/computer')


@app.route('/')
def hello_world():
    return 'Hello WOLF!'


if __name__ == '__main__':
    db.create_all()
    app.run(host='0.0.0.0', port=6789)

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市籍琳,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌贷祈,老刑警劉巖趋急,帶你破解...
    沈念sama閱讀 218,122評論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異势誊,居然都是意外死亡呜达,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,070評論 3 395
  • 文/潘曉璐 我一進店門粟耻,熙熙樓的掌柜王于貴愁眉苦臉地迎上來查近,“玉大人,你說我怎么就攤上這事挤忙∷” “怎么了?”我有些...
    開封第一講書人閱讀 164,491評論 0 354
  • 文/不壞的土叔 我叫張陵册烈,是天一觀的道長戈泼。 經(jīng)常有香客問我,道長赏僧,這世上最難降的妖魔是什么大猛? 我笑而不...
    開封第一講書人閱讀 58,636評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮淀零,結(jié)果婚禮上挽绩,老公的妹妹穿的比我還像新娘。我一直安慰自己驾中,他們只是感情好唉堪,可當我...
    茶點故事閱讀 67,676評論 6 392
  • 文/花漫 我一把揭開白布模聋。 她就那樣靜靜地躺著,像睡著了一般巨坊。 火紅的嫁衣襯著肌膚如雪撬槽。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,541評論 1 305
  • 那天趾撵,我揣著相機與錄音侄柔,去河邊找鬼。 笑死占调,一個胖子當著我的面吹牛暂题,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播究珊,決...
    沈念sama閱讀 40,292評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼薪者,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了剿涮?” 一聲冷哼從身側(cè)響起言津,我...
    開封第一講書人閱讀 39,211評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎取试,沒想到半個月后悬槽,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,655評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡瞬浓,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,846評論 3 336
  • 正文 我和宋清朗相戀三年初婆,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片猿棉。...
    茶點故事閱讀 39,965評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡磅叛,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出萨赁,到底是詐尸還是另有隱情弊琴,我是刑警寧澤,帶...
    沈念sama閱讀 35,684評論 5 347
  • 正文 年R本政府宣布杖爽,位于F島的核電站访雪,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏掂林。R本人自食惡果不足惜臣缀,卻給世界環(huán)境...
    茶點故事閱讀 41,295評論 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望泻帮。 院中可真熱鬧精置,春花似錦、人聲如沸锣杂。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,894評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至赖阻,卻和暖如春蝶押,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背火欧。 一陣腳步聲響...
    開封第一講書人閱讀 33,012評論 1 269
  • 我被黑心中介騙來泰國打工棋电, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人苇侵。 一個月前我還...
    沈念sama閱讀 48,126評論 3 370
  • 正文 我出身青樓赶盔,卻偏偏與公主長得像,于是被迫代替她去往敵國和親榆浓。 傳聞我的和親對象是個殘疾皇子于未,可洞房花燭夜當晚...
    茶點故事閱讀 44,914評論 2 355

推薦閱讀更多精彩內(nèi)容