如何在Django allauth中禁用中间登出页面

26
如何从django allauth禁用中间退出页面。当用户在我的网站上单击注销链接时,我希望他立即注销,我想删除此中间页面。
3个回答

47

在您的设置中将ACCOUNT_LOGOUT_ON_GET设置为True

还可参考文档


3
不应该使用 GET 方式进行注销,因为任何人都可以通过 <img src="https://example.com/account/logout"> 来进行注销操作,而你完全不会察觉到这一点。https://dev59.com/UnA75IYBdhLWcg3wAUF9 - ryancey
1
不知不觉被登出有什么问题吗?如果有的话,那应该是一种功能,而不是一个错误 =) - Will Gordon
Kalob和Adam的答案更有用。即使allauth文档说“GET没有设计来修改服务器状态,在这种情况下可能是危险的。” 用post也很容易实现。 - Vivek Singh

10

因为浏览器会从URL栏预取URL,所以使用GET请求可能不是一个好主意。目前Chrome对此非常差劲;当你在URL栏中输入时,它会向它认为你将要访问的页面发送一个GET请求。

此外,人们可以添加链接,例如<img src="https://example.com/account/logout/">,这样你就会被注销。虽然这不是一个安全隐患,因为它只是把你注销了,但对于你的用户来说肯定很烦人。

相反,你应该考虑使用带有CSRF的表单进行POST请求。Django Allauth已经自带了这个功能。以下是中间注销页面的<form>

<form method="post" action="{% url 'account_logout' %}">
  {% csrf_token %}
  {% if redirect_field_value %}
    <input type="hidden" name="{{ redirect_field_name }}" value="{{ redirect_field_value }}"/>
  {% endif %}
  <button class="STYLE_ME" type="submit">Logout</button>
</form>
在我的情况下,我只是将它添加到网站头部并使用CSS使提交<button>看起来像所有其他链接,以便用户感觉相同,但表单将使用POST请求。 但如果因为某些原因你不能实现这个解决方案,打开你的settings.py文件(或你的主要设置文件)并设置:
ACCOUNT_LOGOUT_ON_GET = True 

^ 上述设置将满足你的需求。如需了解更多Django Allauth设置,请查看他们的配置页面


3

如果您不想用以下方式之类的样式设置表单按钮,可以使用另一种保留POST请求的快捷方式:

隐藏表单:

<form style='display: none;' method="post" action="{% url 'account_logout' %}">
  {% csrf_token %}
  <input type="hidden" name="next" value="/redirect_target/"/>
  <button id="signOutBtn" type="submit">Logout</button>
</form>

使用附加在已经样式化的元素上的click事件提交: ```

附加在已经样式化的元素上的click事件,以提交表单:

```
$(document).on('click', '#signOutLink', function() {
    $('#signOutBtn').click()
});

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接