flask实现api接口以及GET&POST请求参数等的注意事项

上一篇我们讲到了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请求传参。

 

 

 

 

 

 

posted @ 2020-12-29 13:46  砰砰的猿  阅读(15937)  评论(3编辑  收藏  举报