HashID
哈希ID
介绍
哈希ID是可以让你轻松地在 URL 中编码 ID,同时可以在ID到达您的控制器方法之前对其进行自动解码。
例如,我们可以对 10
之类的值进行编码,然后返回 l9avmeG
。当我们将此值传递到像/ dashboard / user / l9avmeG
这样的请求时,我们会在控制器中获取正确的值:
from masonite.request import Request
class SomeController:
# Route: /dashboard/user/@id
# URL: /dashboard/user/l9avmeG
def show(self, request: Request):
request.input('id') #== 10
这对于隐藏主键 ID 非常有用,并且此包使这件事情变得非常简单。
安装
该包要求:
- Masonite 2.0+
您可以通过运行以下命令来安装哈希ID功能所需的依赖项:
$ pip install hashids
$ pip install masonite-essentials
配置
安装后,您可以配置中间件和服务提供者:
中间件
您需要在 config/middleware.py
文件中添加中间件:
...
from masonite.contrib.essentials.middleware import HashIDMiddleware
...
HTTP_MIDDLEWARE = [
...
MaintenanceModeMiddleware,
HashIDMiddleware,
]
服务提供者
您还需要添加服务提供者:
from masonite.contrib.essentials.providers import HashIDProvider
PROVIDERS = [
# Framework Providers
AppProvider,
SessionProvider,
..
..
# Third Party Providers
HashIDProvider,
..
..
]
好了。完成这两项操作后,就可以开始了。
用法
视图
在您的视图中,可以使用在添加服务提供程序时添加的哈希ID模板辅助函数。我们可以这样使用:
{% for user in users %}
<a href="/dashboard/user/{{ hashid(user.id) }}">User</a>
<!-- Generates /dashboard/user/l9avmeG -->
{% endfor %}
控制器
此功能被设计为透明的。当中间件方法运行时,它将检查所有请求输入并尝试对其进行解码。它将解码后的值重新插入到请求输入中,并忽略所有无法正确解码的内容。
您可以像正常情况一样获得输入:
from masonite.request import Request
class SomeController:
# Route: /dashboard/user/@id
# URL: /dashboard/user/l9avmeG
def show(self, request: Request):
request.param('id') #== 10
Inputs
这也适用于获取输入,因此,如果您具有 / dashboard / user?id = l9avmeG
之类的请求,则仍然可以通过使用 input()
获得正确的值。
from masonite.request import Request
class SomeController:
# Route: /dashboard/user
# URL: /dashboard/user?id=l9avmeG
def show(self, request: Request):
request.input('id') #== 10
编码
您还可以通过导入 Essentials 辅助函数自己对值进行编码:
from masonite.request import Request
from masonite.contrib.essentials.helpers import hashid
class SomeController:
def show(self):
hashid(10) #== l9avmeG
解码
您需要一些解码设置。您可以通过传递 decode
关键字来解码以前编码的普通字符串。
from masonite.contrib.essentials.helpers import hashid
class SomeController:
def show(self):
hashid('l9avmeG', decode=True) #== l9avmeG
您还可以传入值字典以进行解码。该函数将尝试对每个键值解码,并插入正确的值。它将跳过无法解码的内容。
from masonite.contrib.essentials.helpers import hashid
class SomeController:
def show(self):
values = {'id': 'l9avmeG': 'name': 'Joe'}
hashid(values, decode=True) #== {'id': '10': 'name': 'Joe'}
这实际上是这个功能底层实现的原理。
本译文仅用于学习和交流目的,转载请务必注明文章译者、出处、和本文链接
我们的翻译工作遵照 CC 协议,如果我们的工作有侵犯到您的权益,请及时联系我们。