Flask API调用报错TypeError:mylemmatize()参数缺失求助
问题分析与解决方案
我一眼就发现了问题的核心——你把Flask的路由装饰器@app.route错加到了工具函数mylemmatize上,而不是真正处理请求的glcoding函数!
错误原因详解
- 当你用
@app.route("/glcoding", methods=['POST'])装饰mylemmatize后,Flask会把这个函数当成/glcoding路径的请求处理函数。但Flask调用路由函数时,默认不会传入额外参数(除非路由定义了变量),可你的mylemmatize强制要求传入token参数,这就直接导致了调用时抛出TypeError: mylemmatize() takes exactly 1 argument (0 given)的错误。 - 真正负责处理请求的
glcoding函数反而没有被路由装饰器标记,完全没起到作用。
除此之外,你的代码还有几个小问题需要修正:
glcoding函数里使用了pd(pandas)但没有导入,运行时会触发NameError。- 调用API时,你把
data写成了JSON字符串,直接传字典给requests.post的json参数会更规范,不需要手动转成字符串。
修正后的API代码
import numpy as np import pandas as pd # 补上缺失的pandas导入 from nltk.corpus import wordnet from nltk.stem.wordnet import WordNetLemmatizer import re from sklearn.externals import joblib import warnings warnings.filterwarnings('ignore') from flask import Flask, jsonify, request app = Flask(__name__) # 移除mylemmatize上的路由装饰器,它只是一个文本处理工具函数 def mylemmatize(token): lmtzr = WordNetLemmatizer() lemmas = {} lemma = None if token not in lemmas: lemma = wordnet.morphy(token) if not lemma: lemma = token if lemma == token: lemma = lmtzr.lemmatize(token) lemmas[token] = lemma return lemmas[token] def cleanmytext(text): words = map(mylemmatize, text.lower().split()) return ' '.join(words) # 把路由装饰器加到正确的请求处理函数glcoding上 @app.route("/glcoding", methods=['POST']) def glcoding(): if request.method == 'POST': json_data = request.get_json() data = pd.read_json(json_data, orient='index') data['Invoice line item description'] = data['Invoice line item description'].apply(cleanmytext) return jsonify(data.to_dict(orient='index')) # 将DataFrame转为字典后再返回,避免jsonify报错 if __name__ == '__main__': app.run(debug=True) # 开启debug模式,方便开发时查看详细错误信息
修正后的API调用代码
import requests BASE_URL = "http://127.0.0.1:5000" # 直接传入字典,requests会自动将其转为JSON格式发送 data = { "0": { "Vendor Number": "166587", "Invoice line item description": "Petrol charges with electricity" } } response = requests.post(f"{BASE_URL}/glcoding", json=data) print(response.json())
额外提示
- 开发阶段建议开启Flask的
debug=True,这样能看到更详细的错误栈,排查问题效率更高。 sklearn.externals.joblib已经被弃用,如果你使用的是较新版本的scikit-learn,建议单独安装joblib包后直接导入import joblib。
内容的提问来源于stack exchange,提问作者pavan subhash
相关产品推荐
相关产品推荐

