前言

顺利出到4啦,其实学习过程中发现了不少错误,不过有些实在是没啥代表性.

最近买了两本小程序和安卓方面的书,其实从初中开始,想搞编程的目的就是写些安卓软件.

现在看来不太可能了.拿来当当兴趣爱好还是没问题的

这几天不是没更新,是在前面的章节里增加/勘误

变更记录

# 19.4.15  起笔

# 19.4.15  增加 Flask-RESTful 获取url传参

# 19.4.15  增加 Flask-RESTful 获取参数时默认值选项

# 19.4.16  增加 SQLAlchemy翻页查询

# 19.5.23  增加 SQLAlchemy增删改

# 19.5.23  增加 SQLAlchemy取值限制

# 19.5.30  增加 返回多个表

# 19.5.30  增加 SQLAlchemy返回时间类型

正文

Flask-RESTful 获取url传参

这里的url参数分为

  1. api/1 # url中捕捉参数

  1. api?aa=bb&cc=dd # 正经的get传参(一key一v)

第一种在路径中加入变量在我之前的博客中有写

因其直接写在url中因此要在路由匹配部分捕捉

  1. commodity_api.add_resource(CommodityClassify, '/commodityclassify/<int:classify_id>', endpoint='commodityclassify')

如上的路由会匹配所有 /commodiyclassify/数字 的url并将该数字传给 CommodityClassify 类,注意的是该类需要接受参数

  1. class CommodityClassify(Resource):
  2. # 商品分类相关
  3.  
  4. def get(self, classify_id=None):
  5. pass

第二种是在 url后传参,我们只需要在在接收时指定取值范围即可

跟上一篇中的获取 body/form 的数据差不多

  1. parser = reqparse.RequestParser() # 生成parser
  2. parser.add_argument('name', type=str, help='name error', required=True, location='args') # 获取form中的name字段,不传报错
  3. parser.add_argument('pwd', type=str, help='pwd error', required=True, location='args') # pwd
  4. args = parser.parse_args(strict=True) # 获取值,如传多余字段报错

RESTFul获取值时默认值

比如我们在需要带翻页的接口时,我们通常给 page page_size 设立默认值(比如page不传默认1)

那么在RESTFul中怎么设置呢?

看 DEMO

  1. parser = reqparse.RequestParser() # 生成parser
  2. parser.add_argument('commodityclassify_id', type=int, help='commodityclassify_id error', required=True, location='args') # 获取get传参的commodityclassify_id
  3. parser.add_argument('page', type=int, default=1, help='page error', location='args') # 页数(默认1)
  4. args = parser.parse_args(strict=True) # 获取值,如传多余字段报错

值得注意的是,如果你开启了 required(严格模式) 就不会走到默认值这一步,因为检测到你没有传送 指定值 就直接返回报错

SQLAlchemy翻页查询

当我们遇到量大的数据时,通常需要分页来保障json的大小

SQLAlchemy分页与sql类似

DEMO如下

  1. parser = reqparse.RequestParser() # 生成parser
  2. parser.add_argument('commodityclassify_id', type=int, required=True, location='args') # 获取get传参的commodityclassify_id
  3. parser.add_argument('page', type=int, default=1, location='args') # 页数(默认1)
  4. parser.add_argument('page_size', type=int, default=20, location='form') # 每页大小(默认20)
  5. args = parser.parse_args(strict=True) # 获取值,如传多余字段报错
  6. session = mysql_DBSession() # 生成session
  7. 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()

  1. session = mysql_DBSession()
  2. obj=session.query(UserOrderForm).filter(UserOrderForm.fk_user_orderform_on_user_id==args["user_id"],UserOrderForm.id==id).first()
  3. obj.status == ''
  4. obj.use_time == datetime.datetime.now()
  5. session.commit()

查找到这个obj

session.delete(obj)

session.commit()

SQLAlchemy取值限制

如果有这样的需求

限定接口接收参数 file 的值为 某个范围中的一个

使用

choices=("faf", "faf") # choices代表必须在这个范围内

  1. parser = reqparse.RequestParser()
  2. parser.add_argument('file', type=str, required=True, location='form', choices=("faf", "faf"))
  3. args = parser.parse_args(strict=True)

一个对象包含多表

如果我们在一个对象返回多个表时

session.query(表1, 表2)

返回为

[

[表1],

[表2]

]

SQLAlchemy 返回Datetime

近日在使用 SQLalchemy 的序列化组件的时候遇到了一个问题

就是数据库的Datetime类型在序列化的时候使用 fields.DateTime() 会转换成字符串

model

  1. found_time = Column(DateTime, nullable=False)

field

  1. "found_time": fields.DateTime(),

返回值为

  1. "found_time": "Tue, 28 May 2019 09:38:51 -0000",

我们来尝试查看fields的源码

  1. class DateTime(Raw):
  2. """
  3. Return a formatted datetime string in UTC. Supported formats are RFC 822
  4. and ISO 8601.
  5.  
  6. See :func:`email.utils.formatdate` for more info on the RFC 822 format.
  7.  
  8. See :meth:`datetime.datetime.isoformat` for more info on the ISO 8601
  9. format.
  10.  
  11. :param dt_format: ``'rfc822'`` or ``'iso8601'``
  12. :type dt_format: str
  13. """
  14. def __init__(self, dt_format='rfc822', **kwargs):
  15. super(DateTime, self).__init__(**kwargs)
  16. self.dt_format = dt_format
  17.  
  18. def format(self, value):
  19. try:
  20. if self.dt_format == 'rfc822':
  21. return _rfc822(value)
  22. elif self.dt_format == 'iso8601':
  23. return _iso8601(value)
  24. else:
  25. raise MarshallingException(
  26. 'Unsupported date format %s' % self.dt_format
  27. )
  28. except AttributeError as ae:
  29. raise MarshallingException(ae)

也就是说,默认的输出实际上是 rfc822 格式的字符串

这是一种时间格式,我们也看到,如果我们使用DateTime方法格式化,只能使用 rfc822 或者 iso8601

在WEB开发中,想要前端页面显示 rfc822 格式的时间,无疑是麻烦的,所以我们可以使用 iso8601

fileds

  1. "found_time": fields.DateTime(dt_format="iso8601"),

结果为

  1. "found_time": "2019-05-28T09:38:51",

这种就令前端渲染方便得多

当然我认为使用时间戳更好,但是我目前还没有找到怎样做

以上方法可以先用着

SQLAlchemy+Flask-RESTful使用(四)的更多相关文章

  1. Python Flask Restful

    Flask  Restful 1.flask restful 在flask基础上进行一些封装,主要用于实现restful接口 2.restful的理解 1)URI(统一资源标识符):每一个URI代表一 ...

  2. Flask框架 (四)—— 请求上下文源码分析、g对象、第三方插件(flask_session、flask_script、wtforms)、信号

    Flask框架 (四)—— 请求上下文源码分析.g对象.第三方插件(flask_session.flask_script.wtforms).信号 目录 请求上下文源码分析.g对象.第三方插件(flas ...

  3. Springboot & Mybatis 构建restful 服务四

    Springboot & Mybatis 构建restful 服务四 1 前置条件 成功执行完Springboot & Mybatis 构建restful 服务三 2 restful ...

  4. 使用swagger 生成 Flask RESTful API

    使用swagger 生成 Flask RESTful API http://www.voidcn.com/article/p-rcvzjvpf-e.html swagger官网 https://swa ...

  5. Flask 学习(四)静态文件

    Flask 学习(四)静态文件 动态 web 应用也需要静态文件,一般是 CSS 和 JavaScript 文件.理想情况下你的服务器已经配置好提供静态文件的服务. 在开发过程中, Flask 也能做 ...

  6. Flask restful源码分析

    Flask restful的代码量不大,功能比较简单 参见 http://note.youdao.com/noteshare?id=4ef343068763a56a10a2ada59a019484

  7. 如何用rflask快速初始化Flask Restful项目

    如何用rflask快速初始化Flask Restful项目 说明 多啰嗦两句 我们在创建flask项目的时候,使用pycharm创建出来的项目比较简陋,而且随着项目的功能完善,项目目录结构会比较多,多 ...

  8. [flask]Restful接口测试简单的应用

    #!/usr/bin/env python # -*- coding: utf-8 -*- # @Author : shenqiang from flask import Flask,make_res ...

  9. 快速创建Flask Restful API项目

    前言 Python必学的两大web框架之一Flask,俗称微框架.它只需要一个文件,几行代码就可以完成一个简单的http请求服务. 但是我们需要用flask来提供中型甚至大型web restful a ...

  10. python 全栈开发,Day142(flask标准目录结构, flask使用SQLAlchemy,flask离线脚本,flask多app应用,flask-script,flask-migrate,pipreqs)

    昨日内容回顾 1. 简述flask上下文管理 - threading.local - 偏函数 - 栈 2. 原生SQL和ORM有什么优缺点? 开发效率: ORM > 原生SQL 执行效率: 原生 ...

随机推荐

  1. JS 输入框输入数字检查

    <input id='ApplyInputNum' type='text' class='mytext form-control' align='left' onblur='InputCheck ...

  2. git submoudle提交

    进入到各个submoudle文件夹 git status 查看所在branch和文件修改状态 git add [files]; git commit "" git pull ori ...

  3. Django(三) ORM 数据库操作

    大纲 一.DjangoORM 创建基本类型及生成数据库表结构 1.简介 2.创建数据库 表结构 二.Django ORM基本增删改查 1.表数据增删改查 2.表结构修改 三.Django ORM 字段 ...

  4. Flutter绘制波浪

    以上动画是仿照 里面的物理动画还未仿写 代码见  https://github.com/dnoyeb/syk_flutter

  5. 通过VuePress管理项目文档(一)

    VuePress 相关链接 完整的Vue组件代码以及完整的文档,仅适用于个人参考学习: 文档预览地址:预览链接 使用VuePress编辑文档的代码访问:组件文档 完整代码:组件代码 Vue组件开发 这 ...

  6. tensorflow-RNN和LSTM

    本章主要介绍循环神经网络(recurrent neuralnetwork,RNN)和长短时记忆网络(long short-term memory,LSTM) 一. RNN简介 1.背景 循环神经网络挖 ...

  7. Android技术文章收集

    Android高工必备技能! 我的 Android 开发实战经验总结 Android开发在路上:少去踩坑,多走捷径 //微信 微信Android客户端架构演进之路 微信Android版智能心跳方案 / ...

  8. 科学地增加postgresql最大连接数

    PG配置文件路径 /etc/postgresql/9.3/main/postgresql.conf 首先如何查看最大连接数 This SQL will help you select max_conn ...

  9. <知识整理>2019清北学堂提高储备D1

    一.枚举: 枚举是最简单最基础的算法,核心思想是将可能的结果都列举出来并判断是否是解. 优点:思维简单,帮助理解问题.找规律.没头绪时 缺点:时空复杂度较高,会有很多冗余的非解(简单的枚举几乎没有利用 ...

  10. app开发中的经常遇到的问题

    1.banner不显示: 原因:配置文件中的 域名写错了. img_path = https://www.beicaiduo.com/znbsite/static/tinymce/upload/ 解决 ...