我是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需要的参数?
答案 0 :(得分:2)
最终,使用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()
函数会因以下几个原因失败:
它使用flask.request
提取GET
arg
'名称'。因为我们没有向烧瓶WSGI提出请求,所以我们不会使用request
。
即使我们设法将请求从前端传递到API,我们遇到的第二个问题是使用jsonify({'address':'100 Main'})
。这将返回一个Response
对象,其中应用程序类型设置为JSON(而不仅仅是JSON
本身)。
您必须完全重写您的函数才能考虑Response
对象并正确处理它。如果您决定再次返回API系统,真的很痛苦......
答案 1 :(得分:1)
根据您构建代码,数据库访问和功能的方式,您只需将另一个应用程序转换为包,导入相关模块并直接调用函数。
您可以在here找到有关模块和包的更多信息。
请注意,正如Ewan所说,使用API有一些优势。我建议您使用requests
,直到您实际需要更快的请求(这可能是过早优化)。
根据您的特定代码,可能值得考虑的另一个想法是创建一个由两个应用程序使用的库。