【问题标题】:Changing django-allauth render_authentication_error behavior更改 django-allauth render_authentication_error 行为
【发布时间】:2015-02-09 03:01:17
【问题描述】:

我是 python/Django 世界的新手,刚刚开始了一个令我非常兴奋的大型项目。我需要让我的用户通过 Facebook 登录,并且我的应用程序有一个非常具体的用户流程。我已经设置了 django-allauth,一切都按我的需要运行。我已经覆盖了 LOGIN_REDIRECT_URL,以便我的用户在登录时登陆我想要的页面。

但是。当用户打开 Facebook 登录对话框然后在不登录的情况下将其关闭时,authentication_error.html 模板将由allauth.socialaccount.helpers.render_authentication_error 呈现,这不是我想要的行为。我希望用户简单地被重定向到登录页面。

是的,我知道我可以通过将模板放在我的 TEMPLATE_DIRS 中来简单地覆盖模板,但是 URL 将不一样。

我得出的结论是,我需要一个中间件来拦截对 http 请求的响应。

from django.shortcuts import redirect

class Middleware():
    """
    A middleware to override allauth user flow
    """
    def __init__(self):
        self.url_to_check = "/accounts/facebook/login/token/"

    def process_response(self, request, response):
        """
        In case of failed faceboook login
        """
        if request.path == self.url_to_check and\
                not request.user.is_authenticated():
            return redirect('/')

        return response 

但我不确定我的解决方案的效率,也不确定它的 pythonesquitude(我只是想出了那个词)。在不使用中间件或信号的情况下,我还能做些什么来改变默认的 django-allauth 行为?

谢谢!

【问题讨论】:

    标签: python django django-allauth


    【解决方案1】:

    是的,我知道我可以通过将模板放在我的 TEMPLATE_DIRS 中简单地覆盖模板,但是 URL 将不一样。

    覆盖模板不会更改 URL。在您覆盖的模板中,您可以对您喜欢的任何 URL 执行 client-side redirect

    【讨论】:

    • 我的意思是 URL 与我想在登录错误时重定向的根 URL 不同。无论如何,我选择简单地使用中间件并将 GET 请求重定向到 /accounts/* 到根 url
    • 酷,很高兴你找到了解决方案。
    【解决方案2】:

    我决定使用中间件并重定向到主页 url,以防在 ^/accounts/.*$ 形式的 URL 上发出 GET 请求

    from django.shortcuts import redirect
    import re
    
    
    class AllauthOverrideMiddleware():
        """
        A middleware to implement a custom user flow
        """
        def __init__(self):
            # allauth urls
            self.url_social = re.compile("^/accounts/.*$")
    
        def process_request(self, request):
    
            # WE CAN ONLY POST TO ALLAUTH URLS
            if request.method == "GET" and\
               self.url_social.match(request.path):
                return redirect("/")
    

    【讨论】:

      猜你喜欢
      • 2020-11-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-04-22
      • 2014-08-30
      • 2014-11-16
      相关资源
      最近更新 更多