順利出到4啦,其實學習過程當中發現了很多錯誤,不過有些實在是沒啥表明性.前端
最近買了兩本小程序和安卓方面的書,其實從初中開始,想搞編程的目的就是寫些安卓軟件.mysql
如今看來不太可能了.拿來噹噹興趣愛好仍是沒問題的sql
這幾天不是沒更新,是在前面的章節裏增長/勘誤數據庫
# 19.4.15 起筆編程
# 19.4.15 增長 Flask-RESTful 獲取url傳參json
# 19.4.15 增長 Flask-RESTful 獲取參數時默認值選項小程序
# 19.4.16 增長 SQLAlchemy翻頁查詢api
# 19.5.23 增長 SQLAlchemy增刪改session
# 19.5.23 增長 SQLAlchemy取值限制app
# 19.5.30 增長 返回多個表
# 19.5.30 增長 SQLAlchemy返回時間類型
這裏的url參數分爲
api/1 # url中捕捉參數
和
api?aa=bb&cc=dd # 正經的get傳參(一key一v)
第一種在路徑中加入變量在我以前的博客中有寫
因其直接寫在url中所以要在路由匹配部分捕捉
commodity_api.add_resource(CommodityClassify, '/commodityclassify/<int:classify_id>', endpoint='commodityclassify')
如上的路由會匹配全部 /commodiyclassify/數字 的url並將該數字傳給 CommodityClassify 類,注意的是該類須要接受參數
class CommodityClassify(Resource): # 商品分類相關 def get(self, classify_id=None): pass
第二種是在 url後傳參,咱們只須要在在接收時指定取值範圍便可
跟上一篇中的獲取 body/form 的數據差很少
parser = reqparse.RequestParser() # 生成parser parser.add_argument('name', type=str, help='name error', required=True, location='args') # 獲取form中的name字段,不傳報錯 parser.add_argument('pwd', type=str, help='pwd error', required=True, location='args') # pwd args = parser.parse_args(strict=True) # 獲取值,如傳多餘字段報錯
好比咱們在須要帶翻頁的接口時,咱們一般給 page page_size 設立默認值(好比page不傳默認1)
那麼在RESTFul中怎麼設置呢?
看 DEMO
parser = reqparse.RequestParser() # 生成parser parser.add_argument('commodityclassify_id', type=int, help='commodityclassify_id error', required=True, location='args') # 獲取get傳參的commodityclassify_id parser.add_argument('page', type=int, default=1, help='page error', location='args') # 頁數(默認1) args = parser.parse_args(strict=True) # 獲取值,如傳多餘字段報錯
值得注意的是,若是你開啓了 required(嚴格模式) 就不會走到默認值這一步,由於檢測到你沒有傳送 指定值 就直接返回報錯
當咱們遇到量大的數據時,一般須要分頁來保障json的大小
SQLAlchemy分頁與sql相似
DEMO以下
parser = reqparse.RequestParser() # 生成parser parser.add_argument('commodityclassify_id', type=int, required=True, location='args') # 獲取get傳參的commodityclassify_id parser.add_argument('page', type=int, default=1, location='args') # 頁數(默認1) parser.add_argument('page_size', type=int, default=20, location='form') # 每頁大小(默認20) args = parser.parse_args(strict=True) # 獲取值,如傳多餘字段報錯 session = mysql_DBSession() # 生成session commoditys_obj = session.query(Commodity).filter(Commodity.fk_commdoity_on_commodity_classify_id==args['commodityclassify_id'] , Commodity.state==1).order_by(Commodity.update_time.desc()).limit(args['page_size']).offset((args['page']-1)*args['page_size']).all() # 查詢某個分類下全部商品按最後更新時間從近到遠
先接 limit(每頁大小) 再接 offset(頁數,注意數據庫從0開始因此page要-1) 最後不要忘了接 all()
增
先引入model
建立session
obj = modelname(字段=值,.....)
session.add(obj)
session.commit()
改
查找到對應obj
直接給某個字段賦值
commit()
session = mysql_DBSession() obj=session.query(UserOrderForm).filter(UserOrderForm.fk_user_orderform_on_user_id==args["user_id"],UserOrderForm.id==id).first() obj.status == '1' obj.use_time == datetime.datetime.now() session.commit()
刪
查找到這個obj
session.delete(obj)
session.commit()
若是有這樣的需求
限定接口接收參數 file 的值爲 某個範圍中的一個
使用
choices=("faf", "faf") # choices表明必須在這個範圍內
parser = reqparse.RequestParser() parser.add_argument('file', type=str, required=True, location='form', choices=("faf", "faf")) args = parser.parse_args(strict=True)
若是咱們在一個對象返回多個表時
session.query(表1, 表2)
返回爲
[
[表1],
[表2]
]
近日在使用 SQLalchemy 的序列化組件的時候遇到了一個問題
就是數據庫的Datetime類型在序列化的時候使用 fields.DateTime() 會轉換成字符串
model
found_time = Column(DateTime, nullable=False)
field
"found_time": fields.DateTime(),
返回值爲
"found_time": "Tue, 28 May 2019 09:38:51 -0000",
咱們來嘗試查看fields的源碼
class DateTime(Raw): """ Return a formatted datetime string in UTC. Supported formats are RFC 822 and ISO 8601. See :func:`email.utils.formatdate` for more info on the RFC 822 format. See :meth:`datetime.datetime.isoformat` for more info on the ISO 8601 format. :param dt_format: ``'rfc822'`` or ``'iso8601'`` :type dt_format: str """ def __init__(self, dt_format='rfc822', **kwargs): super(DateTime, self).__init__(**kwargs) self.dt_format = dt_format def format(self, value): try: if self.dt_format == 'rfc822': return _rfc822(value) elif self.dt_format == 'iso8601': return _iso8601(value) else: raise MarshallingException( 'Unsupported date format %s' % self.dt_format ) except AttributeError as ae: raise MarshallingException(ae)
也就是說,默認的輸出其實是 rfc822 格式的字符串
這是一種時間格式,咱們也看到,若是咱們使用DateTime方法格式化,只能使用 rfc822 或者 iso8601
在WEB開發中,想要前端頁面顯示 rfc822 格式的時間,無疑是麻煩的,因此咱們可使用 iso8601
fileds
"found_time": fields.DateTime(dt_format="iso8601"),
結果爲
"found_time": "2019-05-28T09:38:51",
這種就令前端渲染方便得多
固然我認爲使用時間戳更好,可是我目前尚未找到怎樣作
以上方法能夠先用着