2015-02-09 15 views
5

Tôi là người mới đến vũ trụ python/Django và vừa mới bắt đầu một dự án lớn mà tôi rất vui mừng. Tôi cần có người dùng đăng nhập thông qua Facebook và ứng dụng của tôi có luồng người dùng thực sự cụ thể. Tôi đã thiết lập django-allauth và mọi thứ hoạt động như tôi cần. Tôi đã ghi đè LOGIN_REDIRECT_URL để người dùng của tôi truy cập trang tôi muốn khi họ đăng nhập.Thay đổi django-allauth render_authentication_error behavior

NHƯNG. Khi người dùng mở hộp thoại đăng nhập Facebook và sau đó đóng nó mà không cần đăng nhập, mẫu authentication_error.html được hiển thị bởi allauth.socialaccount.helpers.render_authentication_error và đây không phải là hành vi mà tôi muốn. Tôi muốn người dùng chỉ cần được chuyển hướng đến trang đăng nhập.

Có, tôi biết tôi có thể chỉ cần ghi đè mẫu bằng cách đặt nó trong số TEMPLATE_DIRS của mình, nhưng sau đó url sẽ không giống nhau.

Tôi đã đi đến kết luận tôi cần một phần mềm trung gian để chặn phản hồi đối với yêu cầu 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 

Nhưng tôi không chắc chắn về hiệu quả của giải pháp của tôi cũng như sự thiếu thốn (tôi đã nghĩ ra từ đó) của nó. Có bất cứ điều gì khác tôi có thể làm gì để thay đổi hành vi mặc định django-allauth mà không sử dụng một middleware hoặc một tín hiệu?

Cảm ơn!

Trả lời

0

tôi quyết định sử dụng một middleware và chuyển hướng đến url nhà trong trường hợp một yêu cầu GET được thực hiện trên một URL có dạng ^/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("/") 
0

Vâng, tôi biết tôi có thể chỉ cần ghi đè mẫu bằng cách đặt nó trong TEMPLATE_DIRS của tôi, nhưng sau đó url sẽ không giống nhau.

Ghi đè mẫu sẽ không thay đổi URL. Trong mẫu được ghi đè của bạn, bạn có thể thực hiện một client-side redirect cho bất kỳ URL nào bạn thích.

+0

Những gì tôi có nghĩa là URL sẽ không được giống như gốc url nơi tôi muốn chuyển hướng trên lỗi đăng nhập. Dù sao, tôi đã chọn chỉ đơn giản là sử dụng phần mềm trung gian và chuyển hướng các yêu cầu GET đến/accounts/* tới url gốc –

+0

Thật tuyệt, bạn đã tìm được giải pháp. –

Các vấn đề liên quan