有没有更好的方式来访问我的公共API?

时间:2014-02-12 19:01:12

标签: python flask

我是Flask的新手。

我有一个公共API,称之为api.example.com。

@app.route('/api')
def api():
  name = request.args.get('name')
  ...
  return jsonify({'address':'100 Main'})

我正在我的公共API上建立一个应用程序(称之为www.coolapp.com),所以在另一个应用程序中我有:

@app.route('/make_request')
def index():
  params = {'name':'Fred'}
  r = requests.get('http://api.example.com', params=params)
  return render_template('really_cool.jinja2',address=r.text)

api.example.com和www.coolapp.com都托管在同一台服务器上。我的方式似乎效率低下(当我可以直接访问api时点击http服务器)。是否有更有效的方法让coolapp访问api并仍然能够传递api需要的参数?

2 个答案:

答案 0 :(得分:2)

最终,使用API​​驱动的系统,最好点击API,因为:

  • 用户正在测试API(即使您是用户,也是其他人仍在访问的内容);
  • 然后,您可以轻松扩展 - 如果您变大,可以在负载均衡器后面放置一个API框池。

但是,如果您在同一个盒子上进行开发,则可以创建一个虚拟服务器,在随机端口(localhost)上侦听1982,然后将所有流量转发到您的api代码。

为了简化这一点,我将API_URL抽象为settings.py中的设置(或者您要加载到Flask中的任何内容)并使用:

r = requests.get(app.config['API_URL'], params=params)

如果您发现使用此localhost方法不适合您,或者您必须离开一个方框,这将允许您进行一次更改。

修改

看看你的评论,你希望直接点击Python函数。我不建议这样做(由于上述原因 - 使用API​​本身更好)。如果您确实想要这样做,我也会看到一个问题。

  • 首先,我们必须确保api包含在PYTHONPATH中。容易做,特别是如果你正在使用virtualenvs。
  • 我们from api import views并将我们的代码替换为r = views.api(),以便它调用我们的api()函数。
  • 我们的api()函数会因以下几个原因失败:

    1. 它使用flask.request提取GET arg'名称'。因为我们没有向烧瓶WSGI提出请求,所以我们不会使用request

    2. 即使我们设法将请求从前端传递到API,我们遇到的第二个问题是使用jsonify({'address':'100 Main'})。这将返回一个Response对象,其中应用程序类型设置为JSON(而不仅仅是JSON本身)。 您必须完全重写您的函数才能考虑Response对象并正确处理它。如果您决定再次返回API系统,真的很痛苦......

答案 1 :(得分:1)

根据您构建代码,数据库访问和功能的方式,您只需将另一个应用程序转换为包,导入相关模块并直接调用函数。

您可以在here找到有关模块和包的更多信息。

请注意,正如Ewan所说,使用API​​有一些优势。我建议您使用requests,直到您实际需要更快的请求(这可能是过早优化)。

根据您的特定代码,可能值得考虑的另一个想法是创建一个由两个应用程序使用的库。