使用来自不同Python服务(非Flask)的参数调用Flask API



我构建了一个非常基本的rest API,我想从另一个Python服务调用我的API。

这就是我在flask_app.py:中的内容

@app.route("/<kyw1>/<kyw2>/<start>/<end>/<country>")
def get_trends(kyw1, kyw2, start, end, country):
kyws = [kyw1, kyw2]
timeframe = start + " " + end
pytrend = TrendReq(hl='en-GB', tz=360)
for x in range(0, len(kyws)):
#currentKeyword = [kyws[x]]
pytrend.build_payload(
kw_list=kyws,
cat=0,
timeframe=timeframe,
geo=country)
data = pytrend.interest_over_time()
csv_file_name = kyw1 + "_" + kyw2 + "_from_" + start + "_to_" + end + ".csv"
export_trends(data, csv_file_name)
return render_template("done.html")

因此,我可以使用my_domain.com/sun/sea/12032020/14032020/UK等URL直接从浏览器向该服务提出请求

现在我正在创建另一个Python服务,它将调用Flask API。我在这里的问题是,从我在网上看到的情况来看,url应该是这样构建的:my_domain.com/sun&sea&12032020&14032020&UK我该如何解决这个问题?

您可以在两种将数据传输到API的方法之间进行选择。一个是可变URL。这意味着它不是一个静态的、固定名称的URL,而是一个具有动态组件的URL,这就是您已经拥有的。另一种方法是在查询字符串中使用URL参数。这一点被普遍接受,尤其是在API方面,因为它为开发人员提供了更大的灵活性,因为他们可以将参数排除在默认值之外,等等。此外,对于URL,变量的出现顺序很重要,非常重要,而对于查询字符串,每个变量都是命名的。从可变URL更改为查询字符串args非常容易,flask有一个名为request的模块。如果这是您的变量URL:

@app.route('/api/<str:username>/<str:keyword>/str:field>')
def api(username,keyword,field):
#do something with your data
return jsonify(data=data)

现在,如果您想为您的api添加更多功能,该怎么办。就像size参数一样,开发人员可以更改该参数以接收更多数据?

好吧,您可以使用一个简单的/api路由,而不是使用这个长的基本URL,开发人员可以向该路由添加URL参数。这里有一种方法:

@app.route('/api')
def api():
username = request.args.get("username")
if not username: # a tad of authorisation
return jsonify(message="please submit a username in the query string")
size = request.args.get("size")
keyword = request.args.get("keyword")
# etc etc
return jsonify(results = results,message="success")

现在,随着时间的推移,如果你想添加更多的功能,你不需要更改API的URL,这会让开发人员感到困惑。相反,只需使用另一个请求arg,如typeid

你可以看到这两个URL之间的区别,其中第一个不清楚URL的哪个部分指的是什么位:localhost:5000/api/trilby/socks/t-rex

localhost:500/api?username=trilby&keyword=socks&field=t-rex

如果您中断URL arg,因为它不再工作,当开发人员将其包含在查询字符串中时,它不会导致404或break。相反,多余的不需要的参数将被忽略。这就是为什么在API编程中,查询字符串参数比完整URL更受欢迎。

最新更新