我正在使用Django 1.10
和Python 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 Framework和Django OAuth Toolkit的API。拥有可以使用另一个登录的API(连续两个oauth2)需要将几个参数(?client=fasa&....
)保存在下一个变量中。
答案 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>