一、场景:
当与外部联调或者内部需要走一些固定流程,且重复的事情,往往需要测试经常性的配合且做重复的工作的联调,这时候需要一些工具作为辅助,或者提供给外部
二、框架:
可以通过Python+Flask+Html做一个简单的测试联调工具
三、原理
通过app.py调用我们原有接口进行登录获取token并保存后传给内部接口,并通过Flask框架获取前端传值并传给我们内部接口进行内部接口的调用起到一个web页面操作进行调用内部接口的作用
四、源码:
1、框架结构:
-
app.py:后端代码
-
templates :前端代码

2、后端代码:
from flask import Flask, request, session, redirect, url_for, render_template
import requests
app = Flask(__name__)
app.secret_key = 'your_very_secure_secret_key_2024!' # 生产环境需使用强密钥
# 基础配置
app.config.from_mapping(
BASE_URL="https://XXXX.com",
LOGIN_URL="/login",
APP_URL="https://XXXX.com",
)
@app.before_first_request
def debug_routes():
print("\n=== 已注册的路由清单 ===")
for rule in app.url_map.iter_rules():
print(f"端点: {
rule.endpoint}, 路径: {
rule.rule}")
def get_api_headers():
"""管理端请求头(使用 Bearer 认证)"""
return {
"Authorization": f"Bearer {
session.get('auth_token', '')}",
"Content-Type": "application/json"
}
def get_app_headers():
"""APP端动态请求头(使用 token 字段)"""
return {
"host": "XXXX.com",
"clienttype": "WORKER_APP",
"gxd-client": "WORKER_APP_CLIENT",
"platformtype": "iOS",
"token": session.get('auth_token', '') # 统一使用相同 token
}
def login_required(f):
"""增强版登录校验装饰器"""
def wrapper(*args, **kwargs):
if not session.get('logged_in'):
return redirect(url_for('login'))
return f(*args, **kwargs)
return wrapper
@app.route('/', methods=['GET', 'POST'], endpoint='index') # 根路径
@login_required # 装饰器在 @app.route 下方
def index(): # 函数名即端点名称 'index'
result = None
errors = []
if request.method == 'POST':
session['last_form'] = request.form.to_dict()
action = request.form.get('action')
order_no = request.form.get('order_no', '').strip()
raise_fee = request.form.get('raise_fee', '0')
# 操作映射表
action_handlers = {
'raise': lambda: add_raise_price(order_no, raise_fee),
'query': lambda: get_order_detail(order_no),
'complete': lambda: complete_order(order_no),
'upload': lambda: upload_location(),
'take': lambda: take_order(order_no),
'picking': lambda: picking_order(order_no),
'pickup': lambda: pickup_order(order_no),
'worker_complete': lambda: worker_complete_order(order_no)
}
if action in action_handlers:
handler_result = action_handlers[action]()
if 'error' in handler_result:
errors.append(handler_result['error'])
else:
result = handler_result
else:
errors.append("无效的操作类型")
return render_template('index.html', errors=errors, result=result)
@app.route('/login', methods=['GET', 'POST'])
def login():
if request.method == 'POST':
# 获取登录凭证
username = request.form.get('username')
password = request.form.get('password')
# 构造登录请求
login_url = f"{
app.config['BASE_URL']}{
app.config['LOGIN_URL']}"
try:
response = requests.post(
login_url,
json={
"password": password,
"phone": username
},
timeout=10
)
login_data = response.json()
print(login_data)
print(login_data.get('code'))
print(login_data["data"]["token"])
# 处理登录响应
if login_data.get('code') == 0: # 根据实际文档调整
# 统一存储 token 到 auth_token
session['auth_token'] = login_data["data"]["token"]
session['logged_in'] = True
session.modified = True # 强制保存 Session
print("DEBUG - 当前 Session 内容:", dict(session)) # 输出 Session 内容
return redirect(url_for('index'))
else:
error_msg = login_data.get('message', '登录失败')
return render_template('login.html', error=error_msg)
except Exception as e:
return render_template('login.html',

最低0.47元/天 解锁文章
1153

被折叠的 条评论
为什么被折叠?



