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