7行代码搞定WEB服务

【这是一猿小讲的第 50 篇原创分享】

 

作为一个 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()

 

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

7行代码搞定WEB服务_第1张图片

 

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

7行代码搞定WEB服务_第2张图片

 

1. Flask 是啥?

 

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

7行代码搞定WEB服务_第3张图片

 

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

 

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

 

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

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

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

7行代码搞定WEB服务_第4张图片

 

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

7行代码搞定WEB服务_第5张图片

 

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 再一次发送请求。

7行代码搞定WEB服务_第6张图片

 

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

640?wx_fmt=png

 

出现了哪些幺蛾子?

  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服务_第7张图片

你可能感兴趣的:(7行代码搞定WEB服务)