Django登录"?next ="只保存一个GET参数

时间:2017-01-09 18:55:42

标签: python django django-templates

我正在使用Django 1.10Python Social Auth 0.1.0

我使用Django登录视图,只添加了模板:

<a href="{% url 'social:begin' 'azuread-oauth2' %}{% if request.GET.next %}?next={{ request.GET.next }}{% endif %}" class="btn btn-primary btn-lg"><i class="fa fa-windows" aria-hidden="true"></i> {% trans 'Login' %}</a>

如果我的?next=类似于:

,这样可以正常工作
  • app/something/
  • app/something/?info=blue

但它并不起作用:

  • app/something/?info=blue&moreinfo=red

重复定位的目的是:app/something/?info=blue

对于多个GET参数,重定向是否有任何原因失败? 我已经多次测试过(不同的应用程序,还有Django 1.9,这种情况总是发生)。

这是一个很大的问题,因为我正在构建一个使用Django Rest FrameworkDjango OAuth Toolkit的API。拥有可以使用另一个登录的API(连续两个oauth2)需要将几个参数(?client=fasa&....)保存在下一个变量中。

2 个答案:

答案 0 :(得分:1)

在相关问题escaping ampersand in url中,您会看到包含&符号的保留字符选择

 # $ & + ,  / : ; = ? @ [ ]

这些字符需要进行百分比编码才能被包含/转义。

因此,您的网址需要转义这些字符,例如

app/something/?info=blue%26moreinfo=red

您也可以使用urlencode功能 - 请参阅How to urlencode a querystring in Python?

>>>import urllib
>>>urllib.urlencode({'next': 'app/something/?info=blue&moreinfo=red'})
'next=app%2Fsomething%2F%3Finfo%3Dblue%26moreinfo%3Dred'

对于模板,django有urlencode模板标签,eventually uses pythons built in urllib实现与上面的python代码相同的东西

{{ request.GET.next|urlencode }}

答案 1 :(得分:1)

问题,如@Sayse所述,与网址的编码有关。

在Django中,这已经得到了解决。因此,将呼叫app/something/?info=blue&moreinfo=redand重定向到登录,如:

myapp.com/login?=next=app/something/%3Finfo=blue%26moreinfo=red

这是因为Django方法login_required和LoginRequiredMixin已经对URL进行了编码。这很棒,因为“{{ request.GET.next }}会将next识别为完整的重定向网址。

然后问题出现在{{ request.GET.next }}中,“对网址进行解码”。

使用urlencode解决问题,执行{{ request.GET.next|urlencode }}

<a href="{% url 'social:begin' 'azuread-oauth2' %}{% if request.GET.next %}?next={{ request.GET.next|urlencode }}{% endif %}" class="btn btn-primary btn-lg"><i class="fa fa-windows" aria-hidden="true"></i> {% trans 'Login' %}</a>