改变 django-allauth render_authentication_error 行为
Changing django-allauth render_authentication_error behavior
我是 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 行为?
谢谢!
Yes, I know I could simply override the template by putting it in my TEMPLATE_DIRS, but then the url wouldn't be the same.
覆盖模板不会更改 URL。在您覆盖的模板中,您可以对 URL 您喜欢的任何内容执行 client-side redirect。
我决定使用中间件并重定向到主页 url,以防在 URL 上发出 ^/accounts/.*$
形式的 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("/")
我是 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 行为?
谢谢!
Yes, I know I could simply override the template by putting it in my TEMPLATE_DIRS, but then the url wouldn't be the same.
覆盖模板不会更改 URL。在您覆盖的模板中,您可以对 URL 您喜欢的任何内容执行 client-side redirect。
我决定使用中间件并重定向到主页 url,以防在 URL 上发出 ^/accounts/.*$
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("/")