SQLAlchemy+Flask-RESTful使用(四)

前言

順利出到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返回時間類型

正文

Flask-RESTful 獲取url傳參

這裏的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)  # 獲取值,如傳多餘字段報錯

RESTFul獲取值時默認值

好比咱們在須要帶翻頁的接口時,咱們一般給 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(嚴格模式) 就不會走到默認值這一步,由於檢測到你沒有傳送 指定值 就直接返回報錯

SQLAlchemy翻頁查詢

當咱們遇到量大的數據時,一般須要分頁來保障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()

 SQLAlchemy增刪改

先引入model

建立session

obj = modelname(字段=值,.....)

session.add(obj)

session.commit()

from config.config import mysql_DBSession
from app.user.model import User
session = mysql_DBSession()
user_obj = User(
   phone = args[ " phone " ],
   wx_openid = args["wx_openid"],
   wx_img = args["wx_img"],
   wx_name = args["wx_name"]
   )
session.add(user_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()

 SQLAlchemy取值限制

若是有這樣的需求

限定接口接收參數 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

近日在使用 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",

這種就令前端渲染方便得多

固然我認爲使用時間戳更好,可是我目前尚未找到怎樣作

以上方法能夠先用着

相關文章
相關標籤/搜索