前言

本来没想到能这么快出二的,谁知道序列化组件写上头了.分享知识真的会上瘾....

变更记录

# 19.3.18 起笔

# 19.3.18 使用SQLAlchemy排序方法

# 19.3.18 补充RESTful时接收参数(POST)

# 19.3.21 补充多个路由匹配同一个view

# 19.3.21 补充SQLAlchemy的OR和AND查询

# 19.4.15 将POST传参修改为传参

正文

SQLAlchemy排序

该排序目前在 百度 上的内容多半是 .order_by('字段') 或 .order_by('-字段')的方式,前一个是正序,后一个是倒序

但是实际运行中虽然可以正常跑起来但是会出现提示

C:\Users\Administrator\AppData\Local\Programs\Python\Python37\lib\site-packages\sqlalchemy\sql\compiler.py:763: SAWarning: Can't resolve label reference 'vip_order.found_time'; converting to text() (this warning may be suppressed after 1ler.py:763: SAWarning: Can't resolve label reference 'vip_order.found_time'; converting to text() (tng may behis warning may be suppressed after 10 occurrences)
util.ellipses_string(element.element),

大概就是 SQLAlchemy 组件认不出来但是语法 mysql 可以认出来,所以给个警告.

打印了一下执行的sql,明白了order_by的方式实际上就是在 sql 语句后拼接

order by 括号内内容

那么,正确的排序(不出提示)应该是怎样的呢

.order_by(desc('字段'))  # 倒序
.order_by('字段') # 正序

要注意的是在倒序时需要先引入 desc

from sqlalchemy import desc

接收参数

以POST为例

我觉得POST是使用最频繁的提交方法了.之前也看有人说把其他所有请求砍掉只保留POST也可以开发API

RESTFul的POST参数接收比较复杂,但是有友好的错误提示,多一点代码提高前后端交流的速度.会到就是爽到

不说废话,来看demo

        parser = reqparse.RequestParser()  # 生成parser
parser.add_argument('name', type=int, help='name error', required=True) # 获取name字段,type指类型,help为定义错误时的提示(不写有默认的),required默认False(没接收到默认为None)/True为不传返回错误信息(help)
parser.add_argument('pwd', type=str, help='pwd error', required=True) # pwd字段,同上
args = parser.parse_args(strict=True) # 获取传输的值/strict=True代表设置如果传以上未指定的参数主动报错
name = args['name'] # 获取用户名字
pwd = args['pwd'] # 获取用户密码(前端加密)

解释一下,首先必须要生成parser

然后 add_argument 方法相当于最外层的一个保险,我们之前提到的 友好的错误提示 就在这里生效

来看第二行,第二行是校验 POST提交中 body里的一个key叫 name 的字段,

type意思是restful会简单校验一下 key 的 v 的值,不写type代表不校验

help意思是restful在任何不匹配的情况下都会返回help的值,如果不定义也有默认值(推荐不写help,因为自带的错误提示多变且更加友好)

以下为例子

第三个参数 required 如果为False(默认)代表如果用户没有传则为None / 为True代表不传直接报错(同上)

args = parser.parse_args(strict=True)

这行代表是否启用严格模式,True 代表严格模式启动,如果传入不在上面规定的参数则会报错

Flask-RESTful设置多个路由指向统一的view

有时候我们希望匹配的多个路由进入一个函数/类处理,比如 访问用户的url 我们可以GET时带上id获取该用户信息,也希望POST时不带id代表新增用户

那么,如果按照之前的方法,启动 Flask 时会报错

api.add_resource(Vip, '/website/vip/<int:vip_id>')  # 获取VIP常用信息(匹配url带有int数字的传给Vip视图,url的参数命名为vip_id)
api.add_resource(Vip, '/website/vip') # 新建用户

抛出

AssertionError: View function mapping is overwriting an existing endpoint function: website_1_0.vip

这是因为 Flask-RESTful 内部有一个 endpoint 作为每个路由匹配的view的代号,如果你不写则默认为你的 view 的名字

所以在启动时检测到了两个名为 vip 的代号,所以会报错

解决办法是每次写 路由 时带上endpoint同时保证唯一

api.add_resource(Vip, '/website/vip/<int:vip_id>', endpoint='Vip')  # 获取VIP常用信息(匹配url带有int数字的传给Vip视图,url的参数命名为vip_id)
api.add_resource(Vip, '/website/vip', endpoint='Vips') # 新建用户

SQLAlchemy OR 查询

假设有一个需求是在新用户注册时判断邮箱和昵称是否重复,重复则拦截.我们有两种方法

一:建表设置唯一,然后插入数据时捕捉异常

这种方法也是可行的.但是本人认为最好不要等着数据库报错,所以此方法这里不谈

二:先查询是否有该用户,有则报错

这里介绍方法二

值得注意的是,这里的邮箱和昵称是两张表的字段,而且需求是 name 或 email 重复则报错,这里就用到 OR 查询

Vip_obj = session.query(Vip).join(VipInfo).filter((Vip.name==name)|(VipInfo.email==email)).first()

我们在filter时将多个判断用 | 接起来即可

SQLAlchemy AND 查询

就拿 OR 查询举例子 AND和 OR 差不多

Vip_obj = session.query(Vip).join(VipInfo).filter(Vip.name==name, VipInfo.email==email).first()

用 , 链接即可,不带括号

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

  1. Python Flask Restful

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

  2. Springboot & Mybatis 构建restful 服务二

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

  3. 使用swagger 生成 Flask RESTful API

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

  4. Flask框架(二)—— 反向解析、配置信息、路由系统、模板、请求响应、闪现、session

    Flask框架(二)—— 反向解析.配置信息.路由系统.模板.请求响应.闪现.session 目录 反向解析.配置信息.路由系统.模板.请求响应.闪现.session 一.反向解析 1.什么是反向解析 ...

  5. Flask restful源码分析

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

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

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

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

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

  8. 快速创建Flask Restful API项目

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

  9. 七十八:flask.Restful之flask-Restful标准化返回参数以及准备数据

    对于一个视图函数,可以指定好数据结构和字段用于返回,以后使用ORM模型或者自定义的模型的时候,它会自动获取模型中相应的字段,生成json数据,然后再返回给前端,这需要导入flask_restful.m ...

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

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

随机推荐

  1. C# 使用CsvHelper读取.csv文件

    1,先到包管理器下载 安装CsvHelper. 2,创建一个与csv文件字段名称相同的类 public class SurveyInfoModel { public string DIST_CD { ...

  2. python3 整数类型PyLongObject 和PyObject源码分析

    python3 整数类型PyLongObject 和PyObject源码分析 一 测试环境介绍和准备 测试环境: 操作系统:windows10 Python版本:3.7.0 下载地址 VS版本:vs2 ...

  3. 树莓派3B+(二)

    一.安装SSH工具 这里用的是putty,下载下来是一个exe文件,点开就能用. 下载地址:https://www.chiark.greenend.org.uk/~sgtatham/putty/lat ...

  4. [BJOI2019]奥术神杖(分数规划,动态规划,AC自动机)

    [BJOI2019]奥术神杖(分数规划,动态规划,AC自动机) 题面 洛谷 题解 首先乘法取\(log\)变加法,开\(c\)次根变成除\(c\). 于是问题等价于最大化\(\displaystyle ...

  5. 20165223《网络对抗技术》Exp0 Kali的安装

    (1)安装步骤 Kali官网,下载Kali Linux 64 bit版本,按照网上安装教程进行即可 我是直接拷贝了Kali的.vmx文件(Linux 64bit),在上学期已经安装好的VMware中可 ...

  6. CF1155F Delivery Oligopoly

    题意:给定简单无向图,求一个最小的边集使得这些点是边双,输出方案.n <= 14 解:考虑一个边双肯定是一条一条的链拼起来的.于是每次枚举一条链加上去就行了. 设fs表示点集s形成边双的最小边数 ...

  7. 浅谈JS中逗号运算符的用法

    阅读本文的前提是,你能区分什么是表达式,什么是语句.还有明确运算符和运算数都是些啥东西.所谓的表达式就是一个JavaScript的"短语",JavaScript的解释器可以计算它, ...

  8. python第十三天,函数的嵌套定义,global,nonlocal关键字的使用,闭包及闭包的运算场景,装饰器

    今日内容 1. 函数的嵌套定义 2.global,nonlocal关键字 3.闭包及闭包的运用场景 4.装饰器 函数的嵌套定义 1. 概念:在一个函数内部定义另一个函数 2 .为什么要有函数的嵌套定义 ...

  9. DTW和DBA

    DTW(动态时间调整) 动态时间调整算法是大多用于检测两条语音的相似程度,由于每次发言,每个字母发音的长短不同,会导致两条语音不会完全的吻合,动态时间调整算法,会对语音进行拉伸或者压缩,使得它们竟可能 ...

  10. Java基础--面向对象编程1(类与对象)

    1.类(class)的定义 类是对一组具有相同特征和行为的对象的抽象描述. 在程序中,引入类的概念,就是为了快速生成更多的具有相同特性和行为的事物. 2.对象(object)的定义 对象是类的具体实现 ...