Skip to main content

视图机制

什么是视图机制?

对于熟悉 Django RESTful 设计风格和开发方式的同学来说,可能会对 视图机制 有一定了解。

在 Python 中,视图机制 指的是通过特殊方法和语法来实现自定义对象的不同视图或视角,以提供对对象的不同表示和操作方式。

在 RESTful 风格中,我们通常以不同的 HTTP Method 来区分对资源的操作:

  • GET:获取资源
  • POST:新增资源
  • ...

所以,在 web 开发过程中,这种对资源的完整行为的表达方式,我们称之为 视图机制

Pywss 通过 app.view 实现了简单的视图机制,以便更加友好的支持 RESTful 风格代码。

为了区别于常规路由注册方法,在视图类中我们通过 http 前缀来指定路由方法:

  • http_get
  • http_post
  • http_delete
  • http_put
  • ...

下面我们通过一个 用户视图 来说明。

用户视图
import pywss

class UserView:

def http_get(self, ctx: pywss.Context):
ctx.write({
"code": 0,
"method": "GET",
"message": "获取用户成功",
})

def http_post(self, ctx: pywss.Context):
ctx.write({
"code": 0,
"method": "POST",
"message": "创建用户成功",
})

def http_delete(self, ctx: pywss.Context):
ctx.write({
"code": 0,
"method": "DELETE",
"message": "删除用户成功",
})

def main():
app = pywss.App()
app.view("/api/user", UserView()) # 注意此处是一个实例
app.run()

if __name__ == '__main__':
main()

在此案例中,我们针对 "用户" 这个资源,提供了 获取、创建、删除 三种操作。

不出意外的话,这估计会是你看过最干净的视图类~ 直接就是零继承~

不过也正因为如此,你想要的功能它基本都没有😂😂😂

此外,视图内部是非线程安全的,这意味在操作公共资源的时候,需要加锁。

依赖注入

在现代Web框架中,有不少框架都是支持依赖注入能力的。但不同技术框架之间的实现方式则不尽相同。

Pywss 在视图机制基础上,引入了原生体验的依赖注入能力。

通过对参数的类型注解,可以轻易的实现依赖注入能力。下面通过一个案例来说明:

import pywss

class Repo1:
def get(self):
return "repo1"

class Repo2:
def get(self):
return "repo2"

class Service:

def __init__(self, repo1: Repo1, repo2: Repo2): # Service 依赖 Repo1 和 Respo2
self.repo1 = repo1
self.repo2 = repo2

def get(self):
return "power by " + self.repo1.get() + self.repo2.get()

class UserView:

def __init__(self, service: Service): # UserView 依赖 Service
self.srv = service

def http_get(self, ctx):
ctx.write(self.srv.get())

app = pywss.App()
app.view("/user", UserView) # 注意此处不能是实例,需要由 pywss 自动创建实例
app.run()

在注册视图类时,如果不是实例,那么 Pywss 会自动帮你创建实例。在创建实例的过程中,就实现了依赖注入。

在此案例中,我们可以看到 UserView 依赖 Service,而 Service 依赖 Repo1 和 Repo2。

在整个代码中,我们没有做任何的初始化操作,仅仅是类型注释中指定了数据类型。通过这种方式,Pywss就可以实现依赖注入。