控制器
控制器
介绍
控制器在Masonite框架中是非常重要的部分,而且这也是主要区分Python其它基于MVC框架的部分. 简单来说控制器就是带有方法的类. 就像其他的Python方法中带有的普通的self
一样,这些方法带也有self
参数 ,如果你有过Django的使用经验,Masonite中的方法和Django一样可以视为基于功能的视图,而且他们在类中以相同的方式工作。
相比基于视图的函数来直接开发使用控制器有额外的好处 ,作为开发者可以随心所欲的去处理访问和处理控制器类. 换句话说, 控制器的方法可以使用类中的属性, 私有方法和构造器来打断或者抽象化逻辑,这使得开发更加灵活。
创建一个控制器
使用Masonite提供的craft
命令工具来创建控制器是非常简单的. 我们可以简单的在app/http/controllers
中创建一个文件 , 类名称和文件名称一致 然后在类中创建方法.或者使用craft controller
可以完成上面所有的步骤
$ craft controller Dashboard
当我们运行这个命令的时候我们就在 app/http/controllers/DashboardController.py
有了一个叫做 DashboardController
的新的类. 简单来说, 为了使得我们极大的简便去跟踪所有的类Masonite 希望所有的类都有它自己单独的一个文件,英文文件名和类名是一样的 .这是非常棒的选择, 但是你也可以把他放在任何你希望的地方。
请注意,我们传入的是
Dashboard
,但是创建的文件名为DashboardController
。 Masonite始终假定您要将Controller
附加到末尾。
控制器命名
Masonite 会自动将 Controller 附加到所有控制器的末尾。如果要创建控制器的确切名称,则可以传递 -e
或 -exact
标志。
$ craft controller Dashboard -e
or
$ craft controller Dashboard --exact
这样就创建了一个 Dashboard
控制器,路径为 app/http/controllers/Dashboard.py
。
资源控制器
资源控制器是具有基本CRUD /资源类型方法的控制器,例如创建,更新,显示,存储等。我们可以通过运行以下命令来创建资源控制器:
$ craft controller Dashboard -r
或者
$ craft controller Dashboard --resource
这样就创建了如下所示的控制器:
app/http/controllers/DashboardController.py
""" 模块说明 """
class DashboardController:
"""类文件描述
"""
def show(self):
pass
def index(self):
pass
def create(self):
pass
def store(self):
pass
def edit(self):
pass
def update(self):
pass
def destroy(self):
pass
定义控制器方法
控制器方法与 Django 应用程序中基于函数的视图非常相似。我们的控制器方法如下所示:
app/http/controllers/DashboardController.py
def show(self):
pass
所有控制器方法都必须具有 self 参数。self
参数是普通的python self
对象,该对象通常是当前类的实例。这里没什么特别的。
容器解析
所有控制器方法和构造函数都由容器解析,因此您还可以通过将它们指定为方法中的参数来从容器中检索其他对象:
app/http/controllers/DashboardController.py
from masonite.request import Request
...
def show(self, request: Request):
print(request) # 从容器中获取请求对象
或通过在构造函数中指定它们:
app/http/controllers/DashboardController.py
from masonite.request import Request
class DashboardController:
def __init__(self, request: Request):
self.request = request
def show(self):
print(self.request) # 从容器中获取请求对象
如果需要在多个控制器方法中使用一个类,则建议将其放入构造函数中,以使控制器保持干净清晰。
如果您觉得很神奇,请阅读 ** 服务容器 ** 文档。
需要注意的是,与其他框架不同,我们不必将路由参数指定为控制器方法中的参数。我们可以使用如 request.param('key')
类似方法获取参数。
阅读如何创建和使用视图 视图
返回 JSON
您可以通过几种不同的方式返回 JSON。第一种方法是返回字典,然后将其解析为 JSON :
app/http/controllers/DashboardController.py
def show(self):
return {'key': 'value'}
您可以返回一个列表:
app/http/controllers/DashboardController.py
def show(self):
return ['key', 'value']
或者,您甚至可以返回模型实例或集合。以这两个代码段为例:
app/http/controllers/DashboardController.py
from app.User import User
def show(self):
return User.find(1)
或者
app/http/controllers/DashboardController.py
from app.User import User
def show(self):
return User.where('active', 1).get()
直接返回的分页响应中将包括数据集合以及结果元数据。
接受的查询参数为:「page_size」和「page」 。这些将作为响应的一部分直接处理,无需显式传递它们。
Orator 类 LengthAwarePaginator 和 Paginator 的返回结果有少许不同。
LengthAwarePaginator:
from app.User import User
# 带查询参数 ?page_size=10&page=2
def index(self, request: Request):
return User.paginate()
返回:
{
"total": 44,
"count": 10,
"per_page": 10,
"current_page": 2,
"last_page": 5,
"from": 11,
"to": 20,
"data": [ ... ]
}
Paginator:
from app.User import User
# 没有查询参数的话,使用 Orator 的默认值 (15, 1)
def index(self, request: Request):
return User.simple_paginate()
返回:
{
"count": 15,
"per_page": 15,
"current_page": 1,
"from": 1,
"to": 15,
"data": [ ... ]
}
传递路由参数
您可以将路由参数与解析代码一起传递。这对于保持良好的干净代码库很有用。
例如,这两个代码段是相同的:
app/http/controllers/DashboardController.py
from masonite.request import Request
from masonite.view import View
...
def show(self, request: Request, view: View):
return User.find(request.param('user_id'))
和:
app/http/controllers/DashboardController.py
from masonite.view import View
...
def show(self, user_id, view: View):
return User.find(user_id)
您可以指定参数以及任何其他容器解析。
本译文仅用于学习和交流目的,转载请务必注明文章译者、出处、和本文链接
我们的翻译工作遵照 CC 协议,如果我们的工作有侵犯到您的权益,请及时联系我们。