作为一个 Java 程序猿,写代码久了,各种技术也就都尝试了一个遍。

先从 SSH1(Spring、Struts1、Hibernate)摸爬滚打转变到 SSH2(Spring、Struts2、Hibernate),谁成想 Struts 漏洞频出,于是 S2 的江湖地位很快被 SpringMVC 占领,随着时间的推移,未成想 MyBatis 也逐渐取代了 H 的江湖地位,于是 SSH2 就变成了现在依旧有项目在用SSM(Spring、SpringMVC、MyBatis),而今眼目下几乎被 Spring 全家桶包圆了。

我们都知道无论是 SSH 也好、还是 SSM 也罢,搭建时都会依赖一堆的 JAR 包和一坨坨的代码,而今天一次无心的 flask 尝试,感觉提供一个 WEB 服务真的好简单。

啥也不说,先上代码,去除空行,真的只有 7 行代码!!!

from flask import Flask	

app = Flask(__name__)	

@app.route('/')
def hello_world():
return 'flask 真好!' if __name__ == '__main__':
app.run()

跑起来,看一看是不是那么回事儿。

浏览器访问一下,再探探虚实,果不其然还真能够访问。

1. Flask 是啥?

简单了解,吹吹牛逼。Flask 其实是一个使用 Python 编写的可定制的轻量级 Web 应用微框架,特点就是灵活、轻便、容易上手。

2. 小插曲凑起来,如何发送 JSON 请求?

工作中用过很多模拟发包的工具,用过自己开发的 Jar 包模拟发包,用过浏览器插件模拟发包,但是用的最舒服的莫过于 postman 啦,不妨花半分钟时间一起体验体验。

首先根据下载链接完成安装。

https://www.getpostman.com/downloads/

  

然后打开页面配置请求头,在Headers中添加key为Content-Type,value 为 application/json的键值对。

然后在请求体 Body 中撸入要发送的 JSON 报文,点击 Send 就 OK!

Postman 半分钟就掌握了,点击 send,我们接下来还是回归主题,继续摸索 Flask。

3. 如何获取 JSON 请求?

Flask提供了好几种方式获取请求参数,先尝试用 request.get_json() 获取试试。

from flask import Flask
from flask import request app = Flask(__name__) @app.route('/', methods=['post'])
def hello_world():
# 方式一 接受JSON请求参数
predict_data = request.get_json()
app.logger.debug('request data %s', predict_data)
contract_id = predict_data['contract_id']
app.logger.debug("contract_id %s", contract_id)
return 'flask 真好!' if __name__ == '__main__':
app.debug = True
app.run()

  

用 Postman 发送 JSON 报文,点击 send,我们会看到控制台日志输出发现传入的 JSON 数据正常获取,真简单!

DEBUG in predict_server: request data {'contract_id': 'c90121010'}

DEBUG in predict_server: contract_id c90121010

趁热乎劲,再尝试一下 request.get_data(),实践中发现此种就没有想象的那么任性了,出了一堆的幺蛾子,后面会列出具体的问题。

from flask import Flask
from flask import request
import json app = Flask(__name__) @app.route('/', methods=['post'])
def hello_world():
# 方式二 接受JSON请求参数
predict_data = request.get_data()
app.logger.debug('request data %s', predict_data)
predict_data = json.loads(predict_data)
contract_id = predict_data['contract_id']
app.logger.debug("contract_id %s", contract_id)
return 'flask 真好!' if __name__ == '__main__':
app.debug = True
app.run()

  

代码修改完,flask 会进行实时检测文件是否修改,然后会进行 reloading,真棒!我们直接用 postman 继续发送请求即可。

DEBUG in predict_server: request data b'{\n\t"contract_id":"c90121010"\n}'

DEBUG in predict_server: contract_id c90121010

  

依据日志输出,发现JSON请求报文获取正常。

4. 牛逼的业务咋实现?

开始进行非常牛逼的业务处理,此处用一句输出代表了所有

print('进行了非常牛逼的业务处理')

  

5. 响应的内容如何返回 JSON?

Flask 做的真周到,又帮我提供了 jsonify 函数供我们处理返回的序列化 JSON 数据。

# 封装返回参数 JSON 格式

ret_data = {'ret_code': '0000', 'ret_msg': '成功'}

ret_data = jsonify(ret_data)

  

6. 整体回顾跑跑看

完整的示例代码。

from flask import Flask, jsonify
from flask import request app = Flask(__name__) @app.route('/', methods=['post'])
def hello_world():
# 接受 JSON 请求参数
predict_data = request.get_json()
print('接收请求参数: {0}'.format(predict_data))
# 业务处理
print('进行了非常牛逼的业务处理')
# 封装返回参数 JSON 格式
ret_data = {'ret_code': '0000', 'ret_msg': '成功'}
ret_data = jsonify(ret_data)
print('响应信息: {0}'.format(ret_data))
return ret_data if __name__ == '__main__':
app.run()

借助 postman 再一次发送请求。

看看服务的日志,参数接收正常、业务处理完毕、响应信息封装,一切都是那么的自然。

出现了哪些幺蛾子?

  1. OSError: [Errno 48] Address already in use

    把 5000 端口的进程直接杀掉就行,mac 下用 lsof -i:5000 看哪个进程在占用 5000 端口;然后用 kill -9 PID 把对应 PID 的进程干掉。

  2. TypeError: byte indices must be integers or slices, not str

    当predict_data=request.get_data()获取数据时,然后直接取 predict_data['contract_id'],因为未转变成 JSON,所以会报此种错误。

  3. AttributeError: 'bytes' object has no attribute 'read' (json.load)

    当 json.loads(predict_data) 中的loads漏掉s误写成 json.load(predict_data) 时,会提示此种错误。

7. 写在最后

好了,技术的更新迭代就是快,几分钟的简单分享,主要让你接触并认识一下 flask,并播了一个 postman 的插曲,希望你能够喜欢吧。

最后阿里新六脉神剑中的三脉送给大家:今天最好的表现是明天最低的要求;此时此刻非我莫属;认真生活快乐工作!

7行代码搞定WEB服务的更多相关文章

  1. 10行代码搞定移动web端自定义tap事件

    发发牢骚 移动web端里摸爬滚打这么久踩了不少坑,有一定移动web端经验的同学一定被click困扰过.我也不列外.一路走来被虐的不行,fastclick.touchend.iscroll什么的都用过, ...

  2. 30行代码搞定WCF并发性能测试

    [以下只是个人观点,欢迎交流] 30行代码搞定WCF并发性能 轻量级测试. 1. 调用并发测试接口 static void Main()         {               List< ...

  3. 一行代码搞定 FTP 服务

    环境搭建: python windows/linux pip install pyftpdlib (安装失败请到这里下载:https://pypi.python.org/pypi/pyftpdlib/ ...

  4. [Unity Editor]10行代码搞定Hierarchy排序

    在日常的工作和研究中,当给我们的场景摆放过多的物件的时候,Hierarchy面板就会变得杂乱不堪.比如这样:    过多的层次结构充斥在里面,根层的物件毫无序列可言,整个层次面板显示非常的杂乱不堪,如 ...

  5. Tensorflow快餐教程(1) - 30行代码搞定手写识别

    版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn.net/lusing/article/details ...

  6. 当小程序遇见物联网IoT,几行代码搞定智能插座控制

    在 5G 热潮的推动下,与其紧密结合的物联网(IoT)正日益成为个人和企业工作生活中的重要组成部分,它为企业和个人带来了操作流程的改进和更好的生活体验,随着人工智能(AI)技术的日趋成熟,IoT 与 ...

  7. 如何用Python统计《论语》中每个字的出现次数?10行代码搞定--用计算机学国学

    编者按: 上学时听过山师王志民先生一场讲座,说每个人不论干什么,都应该学习国学(原谅我学了计算机专业)!王先生讲得很是吸引我这个工科男,可能比我的后来的那些同学听课还要认真些,当然一方面是兴趣.一方面 ...

  8. BaseHttpListActivity,几行代码搞定Android Http列表请求、加载和缓存

    Android开发中,向服务器请求一个列表并显示是非常常见的需求,但实现起来比较麻烦,代码繁杂. 随着应用的更新迭代,这种需求越来越多,我渐渐发现了实现这种需求的代码的共同点. 于是我将Activit ...

  9. python爬煎蛋妹子图--20多行代码搞定煎蛋妹子图库

    如果说一个人够无聊的话... 就会做一些十分美(wei)丽(suo)的事情啦哈哈哈... 好的,话不多说,进入正题. 正如标题所示,我们今天的目标很简单: 代码要少,妹子要好. 步骤如下: 1. 首先 ...

随机推荐

  1. 有关于python内置函数exec和eval一些见解笔记

    eval是将函数内的字符串以计算式的方式进行计算并给与外部一个值. 例: a=eval('1+1') print(a) >>>>2 但是如果出现在函数内部字符串中进行赋值会抛出 ...

  2. Flask HTTP请求与响应

    设置请求 POST GET 设置post和get,在route中设置methods参数,除了post,get,还有put ,delete 等 @app.route('/http_test', meth ...

  3. Jira使用说明文档

    1      建立项目 1.1    权限归属 Jira系统管理员 1.2    执行内容 建立项目.工作流分配调整.制定项目负责人及默认经办人 1.3    建立项目过程 登录使用Jira系统管理员 ...

  4. scrapy的扩展件extensions

    extensions.py文件 # -*- coding: utf-8 -*- # 该扩展会在以下事件时记录一条日志: # spider被打开 # spider被关闭 # 爬取了特定数量的条目(ite ...

  5. CSRF攻击原理及预防手段

      CSRF全程 Cross Site Request Forgery, 跨站域请求伪造.这种攻击方式相对于XSS,SQL注入等攻击方式比较晚被发现,今天就来讲解下这种攻击方式以及避免方式. 攻击过程 ...

  6. 【Python】2.13学习笔记 数学函数和随机函数

    我死了,今天看课看过头了,忘了发作业,被典明批评 而且化学作业还是瞎搞的,直接就发了 我觉得我已经提前死亡了,现在不死亡,开学也会的 函数 挺容易的,有很多语言之间重合的部分 注意 在使用某些数学函数 ...

  7. vscode灰暗色主题和 左侧加图标 Spacegray VSCode vscode-icons

    vscode灰暗色主题和 左侧加图标 Spacegray VSCode vscode-icons

  8. DOM-XSS攻击原理与防御

    XSS的中文名称叫跨站脚本,是WEB漏洞中比较常见的一种,特点就是可以将恶意HTML/JavaScript代码注入到受害用户浏览的网页上,从而达到劫持用户会话的目的.XSS根据恶意脚本的传递方式可以分 ...

  9. IdentityServer4实现.Net Core API接口权限认证(快速入门)

    什么是IdentityServer4 官方解释:IdentityServer4是基于ASP.NET Core实现的认证和授权框架,是对OpenID Connect和OAuth 2.0协议的实现. 通俗 ...

  10. Journal of Proteome Research | Utilization of the Proteome Data Deposited in SRMAtlas for Validating the Existence of the Human Missing Proteins in GPM (解读人:梁嘉琪)

    文献名:Utilization of the Proteome Data Deposited in SRMAtlas for Validating the Existence of the Human ...