响应

未匹配的标注
本文档最新版为 4.0,旧版本可能放弃维护,推荐阅读最新版!

响应

控制器方法

您使用的涉及到返回各种数据类型/类/对象都包含在控制器方法中。例如,您可能习惯于在控制器方法中返回 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-TypeContent-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)

本文章首发在 LearnKu.com 网站上。

本译文仅用于学习和交流目的,转载请务必注明文章译者、出处、和本文链接
我们的翻译工作遵照 CC 协议,如果我们的工作有侵犯到您的权益,请及时联系我们。

原文地址:https://learnku.com/docs/masonite/2.3/ad...

译文地址:https://learnku.com/docs/masonite/2.3/ad...

上一篇 下一篇
贡献者:1
讨论数量: 0
发起讨论 只看当前版本


暂无话题~