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

时间:2018-10-13 11:13:21

标签: django django-urls

如何将参数从模板传递到视图函数而不出现在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可以用来执行上述任务吗?如果是,那么应该如何更改模板中的代码以执行此操作?

1 个答案:

答案 0 :(得分:1)

首先,您必须编写两个函数来对这样的值进行编码和解码:

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