我是python / Django宇宙的新手,刚刚开始了一个我非常兴奋的大项目。我需要让我的用户通过Facebook登录,我的应用程序有一个非常具体的用户流程。我已经建立了django-allauth,一切都按照我的需要运作。我已经覆盖了LOGIN_REDIRECT_URL,以便我的用户在登录时登陆我想要的页面。
BUT。当用户打开Facebook登录对话框然后在不登录的情况下关闭它时,authentication_error.html
模板将由allauth.socialaccount.helpers.render_authentication_error
呈现,这不是我想要的行为。我希望用户只需重定向到登录页面。
是的,我知道我可以通过将模板放在我的TEMPLATE_DIRS
中来覆盖模板,但之后网址将不同。
我得出结论我需要一个中间件来拦截对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(我是juste想出那个词)。在没有使用中间件或信号的情况下,我还能做些什么来改变默认的django-allauth行为吗?
谢谢!
答案 0 :(得分:0)
是的,我知道我可以通过将模板放在TEMPLATE_DIRS中来覆盖模板,但是网址不会相同。
覆盖模板不会更改网址。在您覆盖的模板中,您可以client-side redirect对您喜欢的任何网址执行操作。
答案 1 :(得分:0)
我决定使用中间件并重定向到主网址,以防对表格^/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("/")