响应
响应
控制器方法
您使用的涉及到返回各种数据类型/类/对象都包含在控制器方法中。例如,您可能习惯于在控制器方法中返回 view.render()
对象。这将返回一个 View
实例,Masonite 将从中提取出呈现的 html 模板。
以下是您可以返回的所有响应的列表:
字符串
您可以简单地返回一个字符串,该字符串会直接输出到浏览器:
def show(self):
return 'string here'
这会将 header 头和内容长度设置为与常规 HTML 响应相似。
视图
您可以返回 View
对象的实例,Masonite 随后将提取 Jinja 呈现的HTML信息。这是返回视图的正常过程。您可以通过调用视图类并使用 render 方法来做到这一点:
from masonite.view import View
def show(self, view: View):
return view.render('your/template', {'key': 'value'})
请注意,您还可以传入字典作为第二个参数,它将这些变量传递到Jinja模板。
JSON (字典 / 列表)
有几种返回 JSON 响应的方法。最简单的方法是简单地返回一个字典,如下所示:
def show(self):
return {'key': 'value'}
这将返回带有 JSON 相关 header 头的响应。
同样,您可以返回一个列表:
def show(self):
return [1,2,3,4]
JSON (模型)
如果您正在使用模型,则只需返回一个模型就可以很容易地将模型作为JSON响应返回。在处理单个记录时,这很有用:
from app.User import User
# ...
def show(self):
return User.find(1)
这将返回如下响应:
{
"id": 1,
"name": "Brett Huber",
"email": "hubbardtimothy@gmail.com",
"password": "...",
"remember_token": "...",
"verified_at": null,
"created_at": "2019-08-24T01:26:42.675467+00:00",
"updated_at": "2019-08-24T01:26:42.675467+00:00",
}
JSON (集合)
如果您使用集合,也可以返回类似的东西,这将返回略有不同的 JSON 响应:
from app.User import User
# ...
def show(self):
return User.all()
Which will return a response like:
[
{
"id": 1,
"name": "Brett Huber",
"email": "hubbardtimothy@gmail.com",
"password": "...",
...
},
{
"id": 2,
"name": "Jack Baird",
"email": "phelpsrebecca@stanley.info",
"password": "...",
...
},
...
}
]
JSON (分页)
如果需要对响应进行分页,则可以返回 Paginator
的实例。您可以使用 paginate()
方法轻松实现:
from app.User import User
# ...
def show(self):
return User.paginate(10)
传递给 paginate 方法的值是页面大小或要返回的结果条数。
这将返回如下响应:
{
"total": 55,
"count": 10,
"per_page": 10,
"current_page": 1,
"last_page": 6,
"from": 1,
"to": 10,
"data": [
{
"id": 1,
"name": "Brett Huber",
"email": "hubbardtimothy@gmail.com",
"password": "...",
...
},
{
...
}
您可以通过传入适当的查询输入来覆盖页面大小和页码。您可以通过输入 ?page =
输入来更改正在查看的页面,并且可以使用 ?page_size =
输入来更改每页的结果量。
如果要构建API,则可能看起来像 / api / users?page = 2&page_size = 5
。这将在第2页上返回5个结果。
请求类 (重定向)
您还可以在请求类上返回一些方法。这些主要用于重定向。
要重定向到新路由,可以返回 redirect()
方法:
from masonite.request import Request
# ...
def show(self, request: Request):
return request.redirect('/some/route')
重定向有几种不同的方式,例如重定向到命名路由或重定向回之前的路由。有关请求重定向方法的完整列表,请阅读 请求重定向 文档。
响应类
响应类是 Masonite 在内部使用的类,但是如果需要,您可以显式使用它。有些需求是需要在 Masonite 不能为您处理所有响应转换的中间件或服务提供者中设置响应。它通常用于在整个框架中压缩大量冗余逻辑,例如准备响应,状态码,内容长度和内容类型。
以前需要单独设置,但现在响应对象抽象了很多逻辑。在正常开发过程中,您可能永远不需要这个对象,如果您需要像在内核中使用它一样,那文档就在这。
JSON 响应
我们可以使用 json()
方法设置JSON响应。这只需要一个字典:
from masonite.response import Response
def show(self, response: Response):
return response.json({'key': 'value'})
这将为您设置 Content-Type
,Content-Length
,状态码和实际响应。
请记住,这与执行如下操作相同:
def show(self):
return {'key': 'value'}
因为Masonite使用了抽象此逻辑的中间件。
视图和文本响应
The view()
method either takes a View
object or a string:view()
方法携带 View
对象或字符串:
from masonite.response import Response
from masonite.view import View
def show(self, response: Response, view: View):
return response.view('hello world')
def show(self, response: Response, view: View):
return response.view(view.render('some.template'))
设置状态码
可以通过下面2种方式之一在控制器方法中设置状态代码。第一种方法是使用上面的响应对象,但是设置一个status =
参数。像这样:
from masonite.response import Response
from masonite.view import View
def show(self, response: Response, view: View):
return response.view('hello world', status=401)
第二种方法是使用普通响应但返回一个元组:上面的示例可能看起来像这样:
from masonite.response import Response
from masonite.view import View
def show(self, response: Response, view: View):
return 'hello world', 401
重定向
您还可以使用响应对象处理一些非常基本的URL重定向:
from masonite.response import Response
def show(self, response: Response):
return response.redirect('/some/route')
Responsable 类
Responsable 类是允许在您的控制器方法中返回的类. 这些类仅需要继承 Responsable
类,然后包含 get_response
方法。
Let's take a look at a simple hello world example:
from masonite.response import Responsable
class HelloWorld(Responsable):
def get_response(self):
return 'hello world'
现在可以在控制器方法中返回此类:
from some.place import HelloWorld
def show(self):
return HelloWorld()
Masonite 将检查响应是否为 Responsable
的实例,然后运行 get_response
方法。这将向浏览器显示 “ Hello world”。实际上,这就是 Masonites 视图类和邮件类的原理,因此您可以看下它多么强大。
Mailables
您也可以返回 mailables。如果您想在发送电子邮件之前调试电子邮件的外观,那就太好了。您可以通过简单地返回 mail 类的 mailable 方法来实现:
from app.mailables import WelcomeEmail
def show(self, mail: Mail):
return mail.mailable(WelcomeEmail())
现在将显示电子邮件的外观。
下载图像和文件
有时您会想要返回图像或PDF文件之类的文件。您可以使用 Download
类轻松处理,只需将其路径传递进去,Masonite 就会处理其余工作,例如设置正确的 header 头和获取文件内容:
from masonite.response import Download
def show(self):
return Download('path/to/file.png')
这将在浏览器中显示图像或文件。您还可以采用以下2种方式之一强制下载:
from masonite.response import Download
def show(self):
return Download('path/to/file.png').force()
return Download('path/to/file.png', force=True)
最后,您可以在下载图像时更改图像名称:
from masonite.response import Download
def show(self):
return Download('path/to/file.png').force()
return Download('path/to/file.png', name="new-file-name.jpg", force=True)
本译文仅用于学习和交流目的,转载请务必注明文章译者、出处、和本文链接
我们的翻译工作遵照 CC 协议,如果我们的工作有侵犯到您的权益,请及时联系我们。