上一篇我们讲到了flask的初步搭建,本章将讲解flask实现api接口以及get与post请求的演示,
新手搭建flask框架并启动以及flask启动接口地址的修改
一、注解介绍
在写代码之前呢,我们先来介绍几个“注解”,在Python中叫“装饰器”。
装饰器其实就是在一个函数内部定义另外一个函数,然后返回一个新的函数,即动态的给一个对象添加额外的职责。还没明白的话,呃呃呃...先记着功能吧。
1、@app.route()
在flask中,@app.route()的作用主要是注册路径,相当于是一个路由。
我们所见到的接口路径是http://127.0.0.2:8088/aaa/bbb,而在app.py中我们可以利用@app.route()帮助我们实现/aaa/这一层的路径标识。
例如:@app.route('/aaa')所访问的接口就是http://127.0.0.2:8088/aaa/
2、@infoModule.route()
在flask中,@infoModule.route()的作用主要也是注册路径。
他可以帮助我们区分是哪个模块的路径,例如:http://127.0.0.2:8088/aaa/bbb/中的bbb
二、flask蓝图(Blueprint)
在此演示的只是接口的开发与调用,我们通常使用的接口路径为:“ip:端口号/模块名/接口名”的方式,在很多系统开发中,会有很多的模块,有很多人会想到在app.py中写很多个@app.route()来解决,但这样会将来维护代码会非常麻烦,而且容易出错。这时就要用到flask内置了一个模块化处理的类,即flask蓝图(Blueprint)。
Blueprint 是一个存储操作方法的容器,这些操作在这个Blueprint 被注册到一个应用之后就可以被调用,Flask 可以通过Blueprint来组织URL以及处理请求。
蓝图的使用:
1、创建一个蓝图对象
在controller文件中创建一个蓝图对象:
testModule = Blueprint('testModule',__name__)
2、在app.py中注册路由,生成应用对象
app = Flask(__name__)
@app.route('/') def hello_world(): return 'flask_test is running!!!'
3、在应用对象中注册这个蓝图对象
app.register_blueprint(testModule, url_prefix='/testModule')
当这个应用启动后,通过/testModle/可以访问到蓝图中定义的视图函数
三、接口开发
前期准备:
首先在项目根目录下面创建一个controller文件夹,然后创建一个test_controller.py的文件(名字自定义都行,等会import时注意路径就行)。
test_controller.py文件的编写:
import json import datetime from flask import Blueprint,url_for,request,render_template,session,redirect # 创建了一个蓝图对象 testModule = Blueprint('testModule',__name__)
app.py文件的编写:
from flask import Flask from controller.test_controller import testModule app = Flask(__name__)
app.register_blueprint(testModule, url_prefix='/testModule') @app.route('/') def hello_world(): return 'flask_test is running!!!' if __name__ == '__main__': app.run(port=8088)
完成以上准备工作后就可以进行接口的开发,只需要在test_controller.py文件中添加如下代码即可:
1、GET请求无参数
""" GET请求,不带参数 """ @testModule.route("/get_test1",methods=["GET"]) def get_test1(): # 默认返回内容 return_dict = {'return_code': '200', 'return_info': '处理成功', 'result': None} return json.dumps(return_dict, ensure_ascii=False)
效果:
2、GET请求,带参数
""" GET请求,带参数 """ @testModule.route("/get_test2",methods=["GET"]) def get_test2(): # 默认返回内容 return_dict = {'return_code': '200', 'return_info': '处理成功', 'result': None} # 判断入参是否为空 if len(request.args) == 0: return_dict['return_code'] = '5004' return_dict['return_info'] = '请求参数为空' return json.dumps(return_dict, ensure_ascii=False) # 获取传入的params参数 get_data = request.args.to_dict() name = get_data.get('name') age = get_data.get('age') return_dict['result'] = "%s今年%s岁:%s" %(name,age,datetime.datetime.now()) return json.dumps(return_dict, ensure_ascii=False)
效果:
3、POST请求,带参数
""" POST请求,带参数 """ @testModule.route("/post_test1", methods=["POST"]) def post_test1(): #默认返回内容 return_dict = {'return_code':'200','return_info':'处理成功','result':None} # 判断传入的json数据是否为空 if len(request.get_data()) == 0: return_dict['return_code'] = '5004' return_dict['return_info'] = '请求参数为空' return json.dumps(return_dict, ensure_ascii=False) name = request.values.get('name') age = request.values.get('age') # 对参数进行操作 return_dict['result'] = "%s今年%s岁:%s" %(name,age,datetime.datetime.now()) print(return_dict) return json.dumps(return_dict,ensure_ascii=False)
效果:
四、小结
GET请求与POST请求获取参数的方式不同,所以在获取参数时需要注意设定的请求类型,出于安全考虑,一般一般只用POST请求传参。