2012-05-28 19 views
1

请考虑来自此url的请求/messages/compose/(?P<recipients>[\+\.\w]+)/其中收件人是由+符号分隔的用户名。成功(邮件成功发送收件人)后,我在做什么:django url反向隐藏关键字参数

#success_url = 'message_send_success' 
recipients = '+'.join([obj.username for obj in recipients]) #converting them back to original string 
reverse(success_url, kwargs={'recipients': recipients}) 

这是URL向谁匹配:

url(r'^/messages/success/(?P<recipients>[\+\.\w]+)$', 'site.views.message_send_success', name='message_send_success') 

但它会在网址中显示所有收件人,有没有走我可以隐藏这些收件人字符串在url中显示,并可以在请求中访问它?

回答

0

如果你使用的是重定向,则不需要。Django有"shared-nothing" architecture,这意味着在一个请求和下一个没有用户状态之间,服务器上仍然存在,因此,Django不能)“记住”你的收件人在重定向之前是什么,所以它可以在下一个HTTP请求中访问它们。

你想隐藏他们的原因是什么?是否有敏感信息,你不能发回给客户,或类似的东西?避免这种情况的一个选择是简单地重复客户端发送的信息(即,原始的recipients参数)并使对它们执行的操作重做success

+0

其中一个原因是它看起来很乱,如果用户同时向20个用户发送消息,那么所有20个用户名将在url中显示。而且它也是不安全的,因为url中的用户名被公开。 –

+0

在这种情况下,您不应该将它们发送到客户端,不是编码的。我已经说过一个选项,重复原来的'recipients'参数,另一个选项是使用临时表来存储'compose'的结果。恕我直言,前者是更好的,我不认为简化网址是值得额外的努力,在这种情况下,在服务器中存储状态。但是由你来决定。 – mgibsonbr

1

也许你要使用的base64库:

>>> base64.b64encode("what is that?") 
'd2hhdCBpcyB0aGF0Pw==' 
>>> base64.b64decode("d2hhdCBpcyB0aGF0Pw==") 
'what is that?' 

注意:如果你想有更多的安全网址,你应该做一些翻译上的字符串,知道基地(带编码的意志(否则其他用户)很容易解码你的价值

相关问题