【问题标题】:return chalice Response object from chalicelib/utils.py从 chalicelib/utils.py 返回圣杯响应对象
【发布时间】:2018-04-20 01:02:21
【问题描述】:

使用 AWS Chalice,假设 app.py 看起来像这样:

from chalice import Chalice, Response
from chalicelib.utils import some_class

app = Chalice(app_name='myApp')
app.debug = True

@app.route('/myRoute',
       methods=['POST'],
       content_types=['application/octet-stream'])
def myRoute():
   some_class_instance = some_class()
   some_class_instance.some_def()

   return Response(
      body={'hello': 'world'},
      headers={'Content-Type': 'application/json'})

utils.py:

import requests
from chalice import Response

class some_class:
    def some_def():
        return Response(
             body={'key1': 'val1'},
             headers={'Content-Type': 'application/json'})

some_class.some_def 的 return 语句如果写成如图所示,不会返回给客户端。但是如果我从app.py 内部运行some_def,它就会被返回。为什么?

如何将对象从app.py 之外返回给客户端?

【问题讨论】:

    标签: python return aws-lambda serverless-framework chalice


    【解决方案1】:

    如果您不想将应用程序代码保留在 app.py 中,此解决方案适用于 @987654321@ 支持。

    您可以创建一个 chalicelib/ 目录,该目录中的任何内容都会递归地包含在部署包中

    ├── app.py
    ├── chalicelib
    │   └── __init__.py
    |   └── utils.py
    └── requirements.txt
    

    然后在你的 app.py 中像这样导入

    from chalicelib.utils import SomeClass
    
    some_class = SomeClass()
    some_class.some_def()
    

    【讨论】:

    • 嗨 Raja,我的文件夹结构与您展示的完全一样。从我的导入中也可以清楚地看到这一点。请注意,我已经提出了一个适合我的解决方案。客户端在 lambda 中调用一个路由,并且只有从该路由返回的语句才会返回给客户端。所以我在app.py 的那条路线(或def)中捕获了来自utils.py 的返回,等等……
    【解决方案2】:

    我看不到你在 utils.py 中调用了 some_class.some_def。您需要像在 app.py 中那样调用函数:

    some_class.some_def()
    

    【讨论】:

    • 我在app.py 中调用some_def,这可能在我的示例中并不清楚(但最初忘记实例化该类但只是更正了它)。如果我在app.py 中运行相同的代码,它会将正文返回给客户端。但如果写成如图所示不是。希望澄清一下。
    【解决方案3】:

    答案非常简单(来自同事的提示)。您在调用函数 (myRoute) 中评估来自 some_def 的返回值。如果它不是空的,则返回那个。使用问题中的示例,app.py 看起来像这样:

    from chalice import Chalice, Response
    from chalicelib.utils import some_class
    
    app = Chalice(app_name='myApp')
    app.debug = True
    
    @app.route('/myRoute',
               methods=['POST'],
               content_types=['application/octet-stream'])
    def myRoute():
        some_class_instance = some_class()
        r = some_class_instance.some_def()
        if r:
            return r
        else:
            return Response(
                   body={'hello': 'world'},
                   headers={'Content-Type': 'application/json'})
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-06-21
      • 1970-01-01
      • 2011-06-21
      • 2013-02-10
      • 1970-01-01
      • 2011-11-03
      • 1970-01-01
      • 2011-02-23
      相关资源
      最近更新 更多