Передача аргумента для просмотра функции из шаблона без предоставления ее в URL - PullRequest
0 голосов
/ 13 октября 2018

Как передавать аргументы из шаблона для просмотра функции без появления в 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

Этот метод предоставляет переменную pk в URL.Есть ли другой способ сделать это, не раскрывая эту переменную в URL?

Может ли this использоваться для выполнения вышеуказанной задачи?Если да, то как изменить код в шаблоне, чтобы выполнить это?

1 Ответ

0 голосов
/ 13 октября 2018

Прежде всего вы должны написать две функции для кодирования и декодирования значений следующим образом:

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
...