视图机制
什么是视图机制?
对于熟悉 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就可以实现依赖注入。