Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat: add Chinese documentations #1097

Open
wants to merge 4 commits into
base: main
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
22 changes: 11 additions & 11 deletions docs_src/src/components/documentation/Navigation.jsx
Original file line number Diff line number Diff line change
Expand Up @@ -389,14 +389,14 @@ const navigationTitles = {
},
zh: {
'Documentation': '文档',
'Example Application': '示例应用',
'Example Application': '应用示例',
'API Reference': 'API 参考',
'Community Resources': '社区资源',
'Architecture': '架构',
'Framework Comparison': '框架对比',
'Framework Comparison': '性能对比',
'Hosting': '托管',
'Plugins': '插件',
'Future Roadmap': '未来路线图'
'Future Roadmap': '未来发展路线图'
}
}

Expand Down Expand Up @@ -445,11 +445,11 @@ const translations = {
zh: {
titles: navigationTitles.zh,
links: {
'Getting Started': '开始使用',
'Getting Started': '开始',
'Modeling Routes': '路由建模',
'Authentication and Authorization': '身份验证和授权',
'Middlewares': '中间件',
'Real Time Notifications': '实时通知',
'Authentication and Authorization': '身份验证',
'Middlewares': '身份验证中间件',
'Real Time Notifications': '即时通讯',
'Monitoring and Logging': '监控和日志',
'Deployment': '部署',
'OpenAPI Documentation': 'OpenAPI 文档',
Expand All @@ -468,18 +468,18 @@ const translations = {
'Form Data': '表单数据',
'Websockets': 'WebSocket',
'Exceptions': '异常处理',
'Scaling the Application': '应用程序扩展',
'Advanced Features': '高级功能',
'Scaling the Application': '多核扩展',
'Advanced Features': '高级特性',
'Multiprocess Execution': '多进程执行',
'Direct Rust Usage': '直接使用 Rust',
'GraphQL Support': 'GraphQL 支持',
'Dependency Injection': '依赖注入',
'Talks': '演讲',
'Blogs': '博客',
'Introduction': '介绍',
'Introduction': '引入',
'Upcoming Features': '即将推出的功能',
'Railway': 'Railway',
'Exposing Ports': '端口暴露'
'Exposing Ports': '开放端口'
}
}
}
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
export const description =
'在此页面中,我们将深入探讨如何通过不同的接口实现符合预期的交互。'

## 获取客户端 IP 地址

意识到小丑可能也在使用哥谭警察控制面板后,蝙蝠侠决定在他的应用程序中实现访问者 IP 地址追踪功能。

<Row>
<Col>
为了提升性能,他将应用程序扩展到了多个内核,并使用了以下命令:
</Col>
<Col sticky>

<CodeGroup title="Request" tag="GET" label="/hello_world">

```python {{ title: 'untyped' }}
from robyn import Robyn

app = Robyn(__file__)

@app.get("/")
async def h(request):
return f"hello to you, {request.ip_addr}"

```
```python {{ title: 'typed' }}
from robyn import Robyn, Request

app = Robyn(__file__)

@app.get("/")
async def h(request: Request):
return f"hello to you, {request.ip_addr}"

```

</CodeGroup>

</Col>
</Row>
---

## 下一步

在成功实现 IP 跟踪功能后,蝙蝠侠开始思考如何帮助用户更好地理解和使用他的 API 接口。

为此,Robyn 向他介绍了 OpenAPI 文档功能。

[OpenAPI 文档](/documentation/zh/api_reference/openapi)
Original file line number Diff line number Diff line change
@@ -0,0 +1,89 @@
export const description =
'在此页面中,我们将深入探讨如何通过不同的接口实现符合预期的交互。'

创建应用程序的基本版本后,蝙蝠侠希望限制哥谭警察局的访问权限。因此,他询问了 Robyn 提供的身份验证功能。

## 身份验证

正如蝙蝠侠发现的那样,Robyn 提供了一种简便的方法,允许将身份验证中间件添加到应用程序中。通过在路由中指定 `auth_required=True`,可以确保该路由仅对已验证的用户开放。

<Row>
<Col>
</Col>
<Col sticky>

<CodeGroup title="Request" tag="GET" label="/hello_world">

```python {{ title: 'untyped' }}
@app.get("/auth", auth_required=True)
async def auth(request: Request):
# This route method will only be executed if the user is authenticated
# Otherwise, a 401 response will be returned
return "Hello, world"
```

```python {{title: 'typed'}}
@app.get("/auth", auth_required=True)
async def auth(request: Request):
# This route method will only be executed if the user is authenticated
# Otherwise, a 401 response will be returned
return "Hello, world"

```
</CodeGroup>

</Col>
</Row>
<Row>

<Col>
要添加身份验证中间件,您可以使用 `configure_authentication` 方法。此方法需要一个 `AuthenticationHandler` 对象作为参数。该对象定义了如何进行用户身份验证,并使用 `TokenGetter` 对象从请求中提取令牌。Robyn 目前提供了一个 `BearerGetter` 类,它使用 `Bearer` 认证方案从 `Authorization` 请求头中获取令牌。以下是一个基本身份验证处理程序的示例:

</Col>
<Col sticky>
<CodeGroup title="Request" tag="GET" label="/hello_world">

```python {{ title: 'untyped' }}
class BasicAuthHandler(AuthenticationHandler):
def authenticate(self, request: Request) -> Optional[Identity]:
token = self.token_getter.get_token(request)
if token == "valid":
return Identity(claims={})
return None

app.configure_authentication(BasicAuthHandler(token_getter=BearerGetter()))

```

```python {{title: 'typed'}}
class BasicAuthHandler(AuthenticationHandler):
def authenticate(self, request: Request) -> Optional[Identity]:
token = self.token_getter.get_token(request)
if token == "valid":
return Identity(claims={})
return None

app.configure_authentication(BasicAuthHandler(token_getter=BearerGetter()))

```
</CodeGroup>

</Col>

`authenticate` 方法应在用户通过身份验证时返回 `Identity` 对象,否则返回 `None`。`Identity` 对象可以包含任意数据,并可以通过 `request.identity` 属性在路由方法中访问。

<b>
注意:该身份验证系统在底层主要通过 `before request`
中间件实现。您可以忽略此机制,使用自定义中间件实现自己的身份验证系统。然而,Robyn
提供的这一简单易用的解决方案已能满足大多数应用场景的需求。
</b>

</Row>

---

## 下一步

蝙蝠侠已经掌握了身份验证的基本知识,接下来他希望了解一些优化技术,以提升应用程序的性能。他发现了以下功能:

- [常量请求与多核扩展](/documentation/zh/api_reference/const_requests)
Original file line number Diff line number Diff line change
@@ -0,0 +1,75 @@
export const description =
'在此页面中,我们将深入探讨如何通过不同的接口实现符合预期的交互。'

实现身份验证后,蝙蝠侠担心在高峰时段,尤其是小丑企图释放阿卡姆疯人院所有罪犯时,可能会引发大量请求,导致服务器崩溃。为此,Robyn 向他介绍了常量请求和多核扩展功能,以增强应用程序的性能。

## 常量请求

Robyn 告诉蝙蝠侠,可以为每个路由预处理响应,这样即使在路由处理之前,响应就已准备好。这样做可以减少访问路由器的次数,从而提高响应速度。

<Row>
<Col>
</Col>
<Col sticky>

<CodeGroup title="Request" tag="GET" label="/hello_world">

```python {{ title: 'untyped' }}
@app.get("/", const=True)
async def h():
return "Hello, world"
```

```python {{title: 'typed'}}
@app.get("/", const=True)
async def h():
return "Hello, world"

```
</CodeGroup>

</Col>
</Row>

## 多核扩展

Robyn 告诉蝙蝠侠,可以使用 `--workers` 参数将应用程序扩展到多个核心。这样,系统会创建多个应用实例并分配负载,从而提升性能。

<Row>

<Col>

</Col>
<Col sticky>
<CodeGroup title="Request">

```python {{ title: 'untyped' }}
python3 app.py --workers=N --process=M
```

```python {{title: 'typed'}}
python3 app.py --workers=N --process=M
```
</CodeGroup>

</Col>

`authenticate` 方法应在用户通过身份验证时返回 `Identity` 对象,否则返回 `None`。`Identity` 对象可以包含任意数据,并可以通过 `request.identity` 属性在路由方法中访问。

<b>
注意:该身份验证系统在底层主要通过 `before request`
中间件实现。您可以忽略此机制,使用自定义中间件实现自己的身份验证系统。然而,Robyn
提供的这一简单易用的解决方案已能满足大多数应用场景的需求。
</b>

</Row>

---

## 下一步

在提升了应用程序的性能后,蝙蝠侠非常高兴,并希望应用也可以接收从前端项目中发出请求。

然而,这是他却遇到了 CORS(跨源资源共享)问题!于是,他向 Robyn 咨询如何解决这个问题。Robyn 向他介绍了相关的功能:

- [跨域资源共享](/documentation/zh/api_reference/cors)
45 changes: 45 additions & 0 deletions docs_src/src/pages/documentation/zh/api_reference/cors.mdx
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
export const description =
'在此页面中,我们将深入探讨如何通过不同的接口实现符合预期的交互。'

## CORS

每次蝙蝠侠尝试访问 API 时,都会遇到 CORS 错误,这让他苦不堪言。

## 扩展应用程序

<Row>
<Col>
You can allow CORS for your application by adding the following code:
</Col>
<Col>

<CodeGroup title="Request" tag="GET" label="/hello_world">

```python {{ title: 'untyped' }}
from robyn import Robyn, ALLOW_CORS

app = Robyn(__file__)
ALLOW_CORS(app, origins = ["http://localhost:<PORT>/"])
```

```python {{ title: 'typed' }}
from robyn import Robyn, ALLOW_CORS

app = Robyn(__file__)
ALLOW_CORS(app, origins = ["http://localhost:<PORT>/"])
```

</CodeGroup>

</Col>
</Row>

---

## 下一步

修复了 CORS 问题后,蝙蝠侠感到非常满意,现在他希望了解如何在服务器中集成小型前端页面。

于是,Robyn 向他介绍了模板系统,以及如何使用模板来渲染 HTML 页面。

- [模板系统](/documentation/zh/api_reference/templating)
Loading