在 Kubernetes 上使用 Flask 搭建 Python 微服务( 四 )

"since": self.since
 

  • }
     
  •  
    控制器的工作是将 DTO 转换为用于域服务的域对象,反之亦然 。可以从find()操作中观察到这一点 。
     
    1. class UserController:
       
    2. def __init__(self):
    3. self._repo = UserRepositoryImpl()
    4. def find(self, name: str):
    5. try:
    6. user: User = self._repo.fetch(Name(name))
    7. record: UserRecord = UserRecord()
    8. record.name = user.name.value
    9. record.phone = user.phone.value
    10. record.since = user.since
    11. return record
    12. except UserNotFoundException as e:
    13. return None
     
    find()操作接收一个字符串作为用户名,然后将其转换为Name对象,并调用UserRepository获取相应的User对象 。如果找到了,则使用检索到的User`` 对象创建UserRecord` 。回想一下,将域对象转换为 DTO 是很有必要的,这样可以对外部服务隐藏域模型 。
    UserController不需要有多个实例,它也可以是单例的 。通过重写__new__,可以将其建模为一个单例 。
     
    1. class UserController:
    2. def __new__(self):
    3. if not hasattr(self, ‘instance’):
    4. self.instance = super().__new__(self)
    5. return self.instance
    6. def __init__(self):
    7. self._repo = UserRepositoryImpl()
    8. def find(self, name: str):
    9. try:
    10. user: User = self._repo.fetch(Name(name))
    11. record: UserRecord = UserRecord()
    12. record.name = user.name.getValue()
    13. record.phone = user.phone.getValue()
    14. record.since = user.since
    15. return record
    16. except UserNotFoundException as e:
    17. return None
     
    我们已经完全实现了FindService的模型,剩下的唯一任务是将其作为 REST 服务公开 。
    REST API
    FindService只提供一个 API,那就是通过用户名查找用户 。显然 URI 如下所示:
     
    1. GET /user/{name}
       
    此 API 希望根据提供的用户名查找用户,并以 JSON 格式返回用户的电话号码等详细信息 。如果没有找到用户,API 将返回一个 404 状态码 。
    我们可以使用 Flask 框架来构建 REST API,它最初的目的是使用 Python 开发 Web 应用程序 。除了 html 视图,它还进一步扩展到支持 REST 视图 。我们选择这个框架是因为它足够简单 。创建一个 Flask 应用程序:
     
    1. from flask import Flask
       
    2. App = Flask(__name__)
       
     
    然后为 Flask 应用程序定义路由,就像函数一样简单:
     
    1. @app.route('/user/')
       
    2. def get(name):
       
    3. pass
       
    注意@app.route映射到 API/user/,与之对应的函数的get()
    如你所见,每次用户访问 API 如http://server:port/user/Krishna时,都将调用这个get()函数 。Flask 足够智能,可以从 URL 中提取Krishna作为用户名,并将其传递给get()函数 。
    get()函数很简单 。它要求控制器找到该用户,并将其与通常的 HTTP 头一起打包为 JSON 格式后返回 。如果控制器返回None,则get()函数返回合适的 HTTP 状态码 。
     

    1. 推荐阅读