python基于Flask搭建Mock_server

一、简介

Flask是一个轻量级的可定制框架,使用Python语言编写,较其他同类型框架更为灵活、轻便、安全且容易上手。Flask是一个基于Python开发并且依赖jinja2模板和Werkzeug WSGI服务的一个微型框架 ,在这里主要简单介绍使用flask 来mock一个服务端,方便测试在还没完成对应服务功能开发时进行mock测试

安装:

# 安装flask
pip install flask
# 验证flask
pip show flask

二、Flask简单使用

1.配置文件

app=Flask(__name__,template_folder='templates',static_url_path='/static/',static
_path='/zz')
模板路径: template_folder='templates'
静态文件路径: static_url_path='/static/'
静态文件引入别名: static_path='/zz'
设置为调试环境: app.debug=True (代码修改自动更新)

2. 路由系统

1)动态路由(url传参),示例代码如下:

from flask import Flask


# 创建1个Flask实例
app = Flask(__name__)


# 设置一个动态参数name
@app.route('/<name>')
# 视图必须有对应的接收参数name
def first_flask(name):
    print(name)
    return "Hello World~"


if __name__ == '__main__':
    app.run(debug=True)

 执行代码后,访问服务链接,路径加“yoyo”名称,效果如下:

2)指定允许的请求方法

@app.route('/login', methods=['GET', 'POST'])

3.  request请求参数获取

1)post请求参数获取

request.get_data()、request.data,获取未经处理过的原始请求数据而不管内容类型,如果数据格式是json的,则取得的是json字符串;
request.get_json()、和request.json,将请求参数做了处理,得到的是字典格式的,因此排序会打乱依据字典排序规则。

客户端请求代码:

服务端代码:

from flask import Flask, request


# 创建1个Flask实例
app = Flask(__name__)


# 设置一个动态参数name
@app.route('/', methods=['GET', 'POST'])
# 视图函数
def first_flask():
    # 1. request.get_data()、request.data,获取未经处理过的原始请求数据而不管内容类型,如果数据格式是json的,则取得的是json字符串
    a = request.get_data()
    print(a)
    print(type(a))

    b = request.data
    print(b)
    print(type(b))

    # 2.request.get_json(),和request.json,将请求参数做了处理,得到的是字典格式的,因此排序会打乱依据字典排序规则
    c = request.get_json()
    print(c)
    print(type(c))
    name = request.get_json()['name']
    print(f"name的值是:{name}")

    d = request.json
    print(d)
    print(type(d))

    return "Hello World~"


if __name__ == '__main__':
    app.run(debug=True)

2)get请求参数获取

客户端代码:

服务端代码: 

from flask import Flask, request


# 创建1个Flask实例
app = Flask(__name__)


# 设置一个动态参数name
@app.route('/', methods=['GET', 'POST'])
# 视图函数
def first_flask():

    # get请求参数
    # 获取到单个的值
    e = request.args.get('name')
    print(f'获取name的值为:{e}')

    # 可以获取get请求的所有参数返回值是ImmutableMultiDict(不可变的多字典)类型
    f = request.args
    print(f)

    # 将获得的参数转换为字典
    g = request.args.to_dict()
    print(g)
    print(type(g))

    return "Hello World~"


if __name__ == '__main__':
    app.run(debug=True)

服务端打印结果:

 还有一些常用方法,如:

request.headers : 获取请求头

request.method:获取方法

request.url:获取访问url地址,如 http://127.0.0.1:5000/?name=yoyo&age=17

request.cookies:获取请求cookies

三、mock登录及查询用户信息场景

服务端代码:

from flask import Flask, request, jsonify

app = Flask(__name__)
# 解决接收报文中文乱码问题
app.config['JSON_AS_ASCII'] =False


@app.route('/api/login', methods=['POST'], strict_slashes=False)
def login():
    '''登录接口'''
    # 调试信息,打印请求方法
    print(request.method)
    # 获取请求数据,将数据变为字典
    data = request.get_json()
    print(data)

    # 定义用户名和密码变量,从data中取值
    username = data['username']
    pwd = data['password']

    '''
    测试场景设计
    1)参数为空
    2)用户名密码正确
    3)用户名或密码错误
    '''
    if username == '' or pwd == '':
        return jsonify({"code": "001",
                        "msg": "用户名或密码不能为空"})

    elif username == 'yoyo' and pwd == '123456':
        return jsonify({"code": "002",
                        "msg": "登录成功",
                        "info": {
                            "age": 18,
                            "name": "yoyo"},
                        "token": "23657DGYUSGD126731638712GE18271H"
                        })
    else:
        return jsonify(
            {
                "code": "001",
                "msg": "用户名或密码错误"
            }
        )

# 查询个人用户信息接口
@app.route('/api/userinfo', methods=['GET'], strict_slashes=False)
def api_userinfo():
    # 获取请求头的token
    token = request.headers.get('token')
    if token == "23657DGYUSGD126731638712GE18271H":
        return jsonify({
            "httpstatus": 200,
            "data": {
                "userid": 321411,
                "username": "yoyo",
                "userbalance": 5678.90,
                "userpoints": 4215
            }
        })
    else:
        return jsonify(
            {"code": "1000",
             "msg": "用户信息不正确"}
        )


if __name__ == '__main__':
    app.run(debug=True)

说明:

1)# 路由配置中,strict_slashes=False 对URL最后的 / 符号是否严格要求
    例如:@app.route('/index',strict_slashes=False) #访问 http://www.xx.com/index/ 或 http://www.xx.com/index均可
    @app.route('/index',strict_slashes=True) #仅访问 http://www.xx.com/index 

2) Flask 框架里,可以用 jsonify 返回 json 数据。使用 jsonify 时,返回的 http response 的 Content-Type是 application/json,这样做是符合 HTTP 协议的规定的

客户端代码及请求结果:

猜你喜欢

转载自blog.csdn.net/qq_38571773/article/details/129821334