将参数从模板传递给视图函数而不在 URL 中公开它

Passing argument to view function from template without exposing it in URL

如何将参数从模板传递到视图函数而不出现在 URL 中?

我熟悉通过模板向视图函数传递参数的常用方法:

模板

<a href="{% url 'redirection' pk %}">Perform</a>

URL:

url(r'^redirect/(?P<pk>\d+)/$', views.redirection, name='redirection'),

查看功能:

def redirection(request, pk):
    # code of function

此方法公开了 URL 中的 pk 变量。有没有其他方法可以在不在 URL?

中公开此变量的情况下执行此操作

可以用this来完成上面的任务吗?如果是,那么应该如何更改模板中的代码来执行此操作?

首先你必须编写两个函数来编码和解码值,如下所示:

import base64
from Crypto import Random
from Crypto.Cipher import AES

AKEY = 'mysixteenbytekey' # AES key must be either 16, 24, or 32 bytes long

iv = Random.new().read(AES.block_size)


def encode(message):
    obj = AES.new(AKEY, AES.MODE_CFB, iv)
    return base64.urlsafe_b64encode(obj.encrypt(message))


def decode(cipher):
    obj2 = AES.new(AKEY, AES.MODE_CFB, iv)
    return obj2.decrypt(base64.urlsafe_b64decode(cipher))

然后当你想将参数 pk 传递给模板时,像这样编码它:

return render(...{
     ...
     'encode_pk': encode(str(pk)),
     })

然后您可以将其作为 GET 查询传递。当您在模板中创建 URL 时,将 ? 添加到 url 并将您的参数添加到其中,如下所示:

<a href="{% url 'redirection' %}?pk={{ encode_pk }}">Perform</a>

在你看来你可以这样得到这个参数

def redirection(request):
    pk = decode(request.GET.get("pk"))
    # do anything with pk