python flask高级编程之restful_python Flask实现restful api service

一直在用node.js做后端,要逐步涉猎大数据范围,注定绕不过python,因此决定把一些成熟的东西用python来重写,一是开拓思路、通过比较来深入学习python;二是有目标,有动力,希望能持之以恒的坚持下去。

项目介绍

用python语言来写一个restful api service,数据库使用mysql。因为只做后端微服务,并且ORM的实现方式,采用自动生成SQL的方式来完成,因此选择了轻量级的flask作为web框架。如此选择,主要目的是针对中小规模的网络应用,能充分利用关系数据库的种种优势,来实现丰富的现代互联网应用。

REST的六个特性:

Client-Server:服务器端与客户端分离。

Stateless(无状态):每次客户端请求必需包含完整的信息,换句话说,每一次请求都是独立的。

Cacheable(可缓存):服务器端必需指定哪些请求是可以缓存的。

Layered System(分层结构):服务器端与客户端通讯必需标准化,服务器的变更并不会影响客户端。

Uniform Interface(统一接口):客户端与服务器端的通讯方法必需是统一的。

Code on demand(按需执行代码?):服务器端可以在上下文中执行代码或者脚本

restful api

restful api 的概念就不介绍了。这里说一下我们实现协议形式:

[GET]/rs/user/{id}/key1/value1/key2/value2/.../keyn/valuen

[POST]/rs/user[/{id}]

[PUT]/rs/user/{id}

[DELETE]/rs/user/{id}/key1/value1/key2/value2/.../keyn/valuen

说明:

rs为资源标识;

第二节,user,会被解析为数据库表名;

查询时,id为空或0时,id会被忽略,即为列表查询;

新建和修改,除接收form表单外,url中的id参数也会被合并到参数集合中;

删除同查询。

让flask支持正则表达式

flask默认路由不支持正则表达式,而我需要截取完整的URL自己来解析,经查询,按以下步骤很容易完成任务。

使用werkzeug库 :from werkzeug.routing import BaseConverter

定义转换器:

class RegexConverter(BaseConverter):

def __init__(self, map, *args):

self.map = map

self.regex = args[0]

注册转换器 : app.url_map.converters['regex'] = RegexConverter

用正则来截取url : @app.route('/rs/', methods=['PUT', 'DELETE', 'POST', 'GET'])

几点疑问:

正则(.*)理论上应该是匹配任何除回车的所有字符,但不知道为什么,在这里不识别问号(?)

我用request.data来取表单数据,为何request.form取不到?

'/rs/'后若加个反斜杠('/rs//'),request.data就取不到数据,为什么?

解析json数据

解析json数据很容易,但我需要对客户端送上来的数据进行校验,下面是用异常处理又只解析一次的解决方案。

def check_json_format(raw_msg):

try:

js = json.loads(raw_msg, encoding='utf-8')

except ValueError:

return False, {}

return True, js

URL解析

按既定协议解析URL,提取表名,为生成sql组合参数集合。

@app.route('/rs/', methods=['PUT', 'DELETE', 'POST', 'GET'])

def rs(query_url):

(flag, params) = check_json_format(request.data)

urls = query_url.split('/')

url_len = len(urls)

if url_len < 1 or url_len > 2 and url_len % 2 == 1:

return "The params is wrong."

ps = {}

for i, al in enumerate(urls):

if i == 0:

table = al

elif i == 1:

idd = al

elif i > 1 and i % 2 == 0:

tmp = al

else:

ps[tmp] = al

ps['table'] = table

if url_len > 1:

ps['id'] = idd

if request.method == 'POST' or request.method == 'PUT':

params = dict(params, **{'table': ps.get('table'), 'id': ps.get('id')})

if request.method == 'GET' or request.method == 'DELETE':

params = ps

return jsonify(params)

完整代码

git clone https://github.com/zhoutk/pyrest.git

cd rest

export FLASK_APP=index.py

flask run

小结

今天利用flask完成了web基础架构,能够正确解析URL,提取客户端提交的数据,按请求的不同方式来组合我们需要的数据。希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/558178.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Android Studio Gradle输出信息乱码

在更换android studio 版本之后&#xff0c;一般windows 版本在项目构建过程中&#xff0c;gradle 相关的信息输出&#xff0c;会出现乱码&#xff0c;基本上明知是字符编码的问题&#xff0c;但看着就是不爽&#xff0c;例如下面这的情形&#xff1a; ע: ijЩ&#xfffd;&am…

python tkinter布局混用_python tkinter布局界面如何实现?

当我们自己走入一个互联网窗口里&#xff0c;寻找内容&#xff0c;清晰而明朗&#xff0c;这就是涉及了一个页面布局的知识&#xff0c;不只是一个站点&#xff0c;一个网页&#xff0c;设置是一个窗体都是有清晰的布局&#xff0c;语言的编写&#xff0c;就是为了效率执行而存…

Edge 修改字符编码(详细图文)

Microsoft Edge 版本 97.0.1072.62 (官方内部版本) (64 位) 前言 如下图&#xff0c;在访问页面时出现乱码&#xff0c;而且一直返回的内容编码是UTF-8&#xff0c;但Edge没找快捷的编码方式选择 方法一 Internet Explorer 模式加载 打开Edge浏览器 点击Edge右上角三点 点…

json tcl_确定TCL中变量的类型

Tcl的变量没有类型(除了他们是否真的变量的关联数组 - 即使用$foo(bar)语法 - FO r你使用array exists)但Tcl的值。好吧&#xff0c;有点。 Tcl可以在不同类型之间进行变异&#xff0c;因为它认为合适&#xff0c;并且不公开这些信息[*];你所能做的就是检查一个值是否符合特定的…

【Android】Unresolved reference: databinding

检查配置 对应module的build.gradle是否添加了databinding配置 buildFeatures {viewBinding true } // 或者 dataBinding {enabled true }检查包名(特别注意) 报错的包名是否和app包名一致。 例如app包名是 com.xxx.app 而报错的代码中binding的包名路径不在app包名下&…

水塔清洗机器人_最全的中央空调清洗流程

一、施工方案和技术措施项目总体施工纲要积极主动与客户沟通协调。做好现场的勘查工作&#xff1a;严密、详细、周全。掌握客户的动态&#xff0c;不断完善施工进度表。分项目制定严密的施工方案、计划和管理措施。制定详尽的突发事件应急预案。建立安全责任制&…

【Android】ConstraintLayout中RecyclerView 的底部数据显示不全以及覆盖其他View

文章目录xml布局内容预览画面(看着没毛病)&#xff1a;实际画面&#xff1a;解决办法说明xml布局内容 <?xml version"1.0" encoding"utf-8"?> <android.support.constraint.ConstraintLayout xmlns:android"http://schemas.android.com/a…

python中forward的作用_基于numpy的前馈神经网络(feedforward neural network)

***这几天在上Andrew Ng教授开的Coursera系列课程Deep Learning&#xff0c;总觉得光是看视频和做作业还不够&#xff0c;还是得自己动手写写代码&#xff0c;亲自实现课程里提到的算法内容&#xff0c;于是便有了这篇博客&#xff0c;作为自己入门深度学习的里程碑吧。前馈神经…

Charles抓取HTTPS Windows Android iOS 图文详细

文章目录背景操作原理windows 安装CharlesCharles配置第一步&#xff1a;配置HTTP代理&#xff0c;这步与抓取HTTP请求是一样第二步&#xff1a;配置SSL代理第三步 &#xff1a;为手机配置代理iPhone 代理配置Android 代理配置第四步&#xff1a;安装根证书iPhone 安装charles证…

css线条伸缩_CSS3弹性伸缩布局之box布局

CSS3弹性伸缩布局简介2009年&#xff0c;W3C提出了一种崭新的方案----Flex布局(即弹性伸缩布局)&#xff0c;它可以简便、完整、响应式地实现各种页面布局&#xff0c;包括一直让人很头疼的垂直水平居中也变得很简单地就迎刃而解了。但是这个布局方式还处于W3C的草案阶段&#…

Android代码安装apk程序

文章目录一、高低版本兼容代码及配置1.java代码2.AndroidManifest.xml 配置ContentProvider3.paths xml 配置二、老版本代码三、可能出的问题及处理一、高低版本兼容代码及配置 高版本提高了sdcard、 app文件空间的访问权限&#xff0c;高低版本的系统api有一定区别&#xff0…

Android adb 安装apk程序

文章目录ADB简单介绍安装命令安装失败情况adb 安装测试包adb 安装卸载的所有命令摘要前言多数情况下&#xff0c;用户都是从应用商店或某网页下载apk后从手机上直接安装apk文件&#xff0c;在调试或下载到电脑上时候&#xff0c;我们就可以直接通过adb安装到手机。在测试小伙伴…

XML十六进制无效的字符(0x0b 0x0c 0x02)

文章目录解决方法ASCII“字符”1、ASCII 打印字符2、ASCII 非打印控制字符3、扩展 ASCII 打印字符4、ASCII 之外ASCII 字符输入方法与常用地方1、在文档中插入 ASCII 字符2、输入方法前言xml 中包含了非打印字符的情况下&#xff0c;即使是放在cdata 中&#xff0c;在不同平台上…

tab栏圆点按钮_uniapp tabbar上的小圆点

需求在tabbar的图标右侧显示和隐藏小圆点。一般表示有新消息、新更新。基本代码序号从0开始计算。uni.showTabBarRedDot({index:1});uni.hideTabBarRedDot({index:1});修改代码App.vue或index页在App.vue的onLaunch周期或者是index页的onLoad加入代码&#xff0c;判定是否需要显…

Android OpenGLES2.0(一)OpenGLES2.0基础介绍

文章目录什么是OpenGL ES&#xff1f;OpenGL ES可以做什么&#xff1f;OpenGL ES版本及Android支持情况OpenGL ES 2.0的优点OpenGL ES 2.0中基本概念顶点着色器片元着色器着色器语言坐标系图形的绘制投影光照纹理映射其它OpenGL ES 2.0过程及理解什么是OpenGL ES&#xff1f; O…

如何 方法内指令重排 进制_谈谈指令重排

这个知识点也是很多人说不清道不明的地方&#xff0c;感觉都知道&#xff0c;说又说不出来。为什么会这样呢&#xff1f;因为这几个字&#xff0c;很容易被当成动词去理解&#xff0c;其实正确的理解是当成名词&#xff0c;即指令重排现象。那什么时候会产生指令重排现象呢&…

Windows ‘ls‘ 不是内部或外部命令,也不是可运行的程序 或批处理文件

文章目录前言原因解决办法前言 Windows和mac混用或Windows与linux混用的情况下&#xff0c;在windows dos窗口随手一个ls&#xff0c;出现了 ‘ls’ 不是内部或外部命令&#xff0c;也不是可运行的程序 或批处理文件。 原因 ls是linux的命令&#xff0c;不是windows的命令,win…

python问题解决了吗_Python 问题怎么解决?

展开全部主要问题和解决方法如下&#xff1a;中文路径的问题&#xff1a;在D盘下保32313133353236313431303231363533e58685e5aeb931333365633939存一个名字为‘中文.txt‘的文件。运行如下测试代码&#xff1a;# -*- coding: utf-8 -*-fopen(D:\\中文.txt, r)print f.read()&a…

Linux ls 命令使用介绍

文章目录命令格式命令功能常用参数常用示例示例1 列出文件夹下的所有文件和目录的详细资料示例2 列出当前目录中所有以“t”开头的目录的详细内容&#xff0c;示例3 只列出文件下的子目录命令&#xff1a;示例4 列出目前工作目录下所有名称是以s开头的档案&#xff0c;越新的排…

exls导入数据库 php_PHP读取excel文件并导入数据库

PHPExcel是一个PHP类库&#xff0c;用来帮助我们简单、高效实现从Excel读取Excel的数据和导出数据到Excel。下面是PHPExcel读取的使用教程&#xff1a;1.首先下载PHPExcel2.下载好文件&#xff0c;解压可以得到如下文件&#xff1a;为了使用方便&#xff0c;我们可以在根目录创…