8

Tôi đang sử dụng Django với Django REST framework làm phụ trợ và AngularJS trên giao diện người dùng.Làm thế nào để tùy chỉnh activate_url trên django-allauth?

Để quản lý người dùng, tôi đang sử dụng django-rest-auth sử dụng django-allauth để quản lý người dùng. Là cơ sở tôi đã sử dụng bản demo từ django-rest-auth.

Vấn đề là sau khi đăng ký khi bạn cố gắng để xác minh email nó gửi email với url kích hoạt: 127.0.0.1:8000/account/confirm-email/yhca8kmijle0ia7k3p7ztbvnd2n1xepn9kyeuaycmlzll5xw19ubjarnvjrot7eu/

nơi * 127.0.0.1:8000 là backend Django.

Nhưng trong trường hợp của tôi, nó sẽ gửi url giống như localhost:9000/#/verifyEmail/akv2dcvrfnk9ex5fho9jk0xx1ggtpfazmi8sfsoi2sbscoezywfp7kzcyqnizrc0. Để xác minh này sẽ được thực hiện từ giao diện người dùng, trong đó localhost:9000 là lối vào AngularJS của tôi.

Có cách nào để tùy chỉnh activate_url trên django-allauth không?

+0

Bạn có thấy câu hỏi này không? https://stackoverflow.com/questions/24128433/django-allauth-how-to-modify-email-confirmation-url – ferrangb

Trả lời

2

Không thể tìm thấy bất kỳ tài liệu quy định cụ thể này (chắc chắn họ phải có đâu đó ngoài kia), nhưng nhìn vào github họ chỉ URL đảo ngược trên "account_confirm_email"

Bạn chỉ cần thêm một URLPATTERN với name="account_confirm_email" param sau của họ, như vậy:

from allauth.account.views import confirm_email 

ulrpatterns= patterns('', 
    ... 
    url(r'^rest-auth/', include('rest_auth.urls')), 
    url(r'^verify-email/(?P<key>\w+)/$', 
     confirm_email, 
     name="account_confirm_email"), 
) 

Vấn đề với điều này là bạn đang trực tiếp giải quyết sự phụ thuộc của sự phụ thuộc. Nếu phiên bản mới hơn của django-restauth không sử dụng phiên bản này, nó có thể ảnh hưởng đến bạn.

Nếu bạn đang mở để sử dụng các thư viện khác, tôi hiện đang sử dụng djoser với DRF và thấy nó khá đơn giản. Có lẽ nó đáp ứng nhu cầu của bạn.

4

Tôi đã cố gắng để làm cho kích hoạt từ front-end bằng cách ghi đè lớp DefaultAccountAdapter và trọng phương pháp send_mail như quy định trong django-allauth doc:

Nếu điều này không phù hợp với nhu cầu của bạn, bạn có thể treo lên cơ chế riêng của bạn bằng cách ghi đè các phương pháp send_mail của adapter tài khoản (allauth.account.adapter.DefaultAccountAdapter)

đầu tiên tôi đã viết url backend mà tôi sử dụng để xác nhận một email:

api_patterns = [ 
... 
url(r'^verify-email/(?P<key>\w+)/$', 
     confirm_email, name="account_confirm_email"), 
... 
] 

sau đó tôi đã chỉ định adapter tùy chỉnh và url frontend trong settings.py như sau:

ACCOUNT_ADAPTER = 'API.adapter.DefaultAccountAdapterCustom' 
URL_FRONT = 'http://localhost:9000/' 

Và viết này trong adapter.py từ ứng dụng của tôi:

from allauth.account.adapter import DefaultAccountAdapter 
from django.conf import settings 

class DefaultAccountAdapterCustom(DefaultAccountAdapter): 

    def send_mail(self, template_prefix, email, context): 
     context['activate_url'] = settings.URL_FRONT + \ 
      'verify-email/' + context['key'] 
     msg = self.render_mail(template_prefix, email, context) 
     msg.send() 

Url kích hoạt được gửi trong email bây giờ sẽ trông giống như: http://127.0.0.1:9000/verify-email/<key>/

Tôi đã thay đổi activate_url thành t anh ta URL_FRONT chuỗi tôi đã chỉ định trong settings.py và nối thêm khóa để thực hiện yêu cầu nhận từ giao diện người dùng đến url tôi đã viết trước đó (Giả sử http://localhost:8000/verify-email/<key>).(Trước đây thiết lập ACCOUNT_CONFIRM_EMAIL_ON_GET đến True để xác nhận email chỉ bằng cách thực hiện yêu cầu nhận được)

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