因为在工作中需要将写好的Python程序改写成API接口供其他部门使用,所以这篇博客重点利用Flask的请求对象完成数据传输,对于更深层次的理论方面的内容,以后再补充;
本文只涉及本地服务器,再远程服务器上的部署也不涉及。本文使用的Flask及Python版本信息如下:
Flask:1.1.2
Python:3.8.8
1. Flask包
Flask是一个轻量级的可定制框架,使用Python语言编写,较其他同类型框架更为灵活、轻便、安全且容易上手。从一个最简单的例子入手:
from flask import Flask
app = Flask(__name__) #该语句用于创建一个Web应用的实例
@app.route('/') #定义路由规则
def index():
return 'Hello World'
if __name__ == '__main__':
app.run(debug=True)
在Anaconda中运行之后,在浏览器中打开:http://127.0.0.1:5000 就可以看到运行结果。如下:
2.Flask请求对象Request
2.1 GET模式
from flask import Flask,request
import json
app=Flask(__name__)
@app.route('/test_1',methods=['GET'])
def check():
return_dict={'statusCode':200,'message':'successful','result':False}
name=request.args.get('name') #
age=request.args.get('age')
return_dict['result']=tt(name,age)
return json.dumps(return_dict,ensure_ascii=False)#ensure_ascii设置为False时能显示中文
def tt(name,age):
result_str='{}今年{}岁'.format(name,age)
return result_str
if __name__=='__main__':
app.run(debug=True)
运行上述代码,运行成功输出如下代码:
* Serving Flask app "server" (lazy loading)
* Environment: production
WARNING: This is a development server. Do not use it in a production deployment.
Use a production WSGI server instead.
* Debug mode: on
* Restarting with windowsapi reloader
在浏览器中输入如下网址:http://127.0.0.1:5000/test_1?name=小明&age=20(注意虽然name是字符串类型,但在这种写法里不需要加引号),其具体执行结果如下:
2.2 POST模式
网上很多资料上都说这种模式下需要安装Postman才能调试,但是我这里并没有安装Postman,就直接用Anaconda来调试了。POST模式下需要写两个代码文件:
server.py
from flask import Flask,request
import json
app=Flask(__name__)
@app.route('/test_1',methods=['POST'])
def check():
return_dict={'statusCode':200,'message':'successful','result':False}
if not request.get_json():
return json.dumps(return_dict,ensure_ascii=False)
name=request.get_json()['name']
age=request.get_json()['age']
result=tt(name,age)
return_dict['result']=result
return json.dumps(return_dict,ensure_ascii=False)
def tt(name,age):
result_str='{}今年{}岁'.format(name,age)
return result_str
if __name__=='__main__':
app.run(debug=True)
此时再Anaconda的spyder中运行该文件,具体结果如下(这说明server端已经正常启动了):
再写一个test.py文件,具体如下:
import requests
if __name__=="__main__":
testData={'name':'小明','age':12}
r=requests.post('http://127.0.0.1:5000/test_1',json=testData)
print(r.json())
再Anaconda中重新打开一个console,执行该test.py文件。就可以直接看到返回的结果:
因为这里没有使用Postman这种可视化的方式,所以在代码调试的时候可能有点麻烦。若程序没有正确执行想要查看报错信息的时候,可以在console中输入如下命令进行查看:
3.遇到的问题
(1)ConnectionError异常。具体报错信息
ConnectionError: HTTPConnectionPool(host=‘localhaost’, port=5000): Max retries exceeded with url: /test_1 (Caused by NewConnectionError(’<urllib3.connection.HTTPConnection object at 0x000001D008A10070>: Failed to establish a new connection: [Errno 11001] getaddrinfo failed’))
遇到这个问题可能是因为代码里使用了localhost,将localhost改成具体的http://127.0.0.1:5000就可以了(如果修改过端口号,这里就不能用5000了).
(2) 要注意GET和POST模式下取数方式的不同。