Djoser 用户激活电子邮件 POST 示例

Posted

技术标签:

【中文标题】Djoser 用户激活电子邮件 POST 示例【英文标题】:Djoser user activation email POST example 【发布时间】:2018-04-19 15:31:08 【问题描述】:

我正在使用 Django rest 框架和 Djoser 进行身份验证和用户注册。

当新用户注册时,Djoser 会发送一封激活电子邮件,其中包含执行 GET 请求的链接。为了激活,我需要从激活 URL 中提取 uid 和令牌,并为 Djoser 发出 POST 请求以激活用户。

我的环境是 Python 3 和 Django 1.11,Djoser 1.0.1。

我想做的是在Django中处理get请求,提取uid和token,然后发出POST请求。我已经提取了 uid 和令牌,并希望进行 POST(在此 GET 请求中)。 我不知道如何在后台发出这个 POST 请求。

我的网址是这样的:

http://127.0.0.1:8000/auth/users/activate/MQ/4qu-584cc6772dd62a3757ee

当我在电子邮件中单击它时,它会发出 GET 请求。

我在 Django 视图中处理这个问题。

视图需要像这样发出 POST 请求:

http://127.0.0.1:8000/auth/users/activate/

data= [(‘uid’=‘MQ’), (‘token’=‘4qu-584cc6772dd62a3757ee’),]

我处理 GET 的观点是:

from rest_framework.views import APIView
from rest_framework.response import Response
import os.path, urllib


class UserActivationView(APIView):
    
    def get (self, request):
        urlpathrelative=request.get_full_path()
        ABSOLUTE_ROOT= request.build_absolute_uri('/')[:-1].strip("/")

        spliturl=os.path.split(urlpathrelative)
        relpath=os.path.split(spliturl[0])
        uid=spliturl[0]
        uid=os.path.split(uid)[1]
        
        token=spliturl[1]
        postpath=ABSOLUTE_ROOT+relpath[0]+'/'
        post_data = [('uid', uid), ('token', token),]     
        result = urllib.request.urlopen(postpath, urllib.parse.urlencode(post_data).encode("utf-8"))
        content = result.read()
        return Response(content)

【问题讨论】:

不确定你为什么需要这个。 Djoser 应该处理整个过程,不需要单独发出 POST 请求。 Djoser 不处理它。请看这个:github.com/sunscrapers/djoser/issues/14 我在这里添加我的代码: 【参考方案1】:

views.py

from rest_framework.views import APIView
from rest_framework.response import Response
import requests

class UserActivationView(APIView):
    def get (self, request, uid, token):
        protocol = 'https://' if request.is_secure() else 'http://'
        web_url = protocol + request.get_host()
        post_url = web_url + "/auth/users/activate/"
        post_data = 'uid': uid, 'token': token
        result = requests.post(post_url, data = post_data)
        content = result.text
        return Response(content)

urls.py

urlpatterns = [
    url(r'^admin/', admin.site.urls),
    url(r'^auth/users/activate/(?P<uid>[\w-]+)/(?P<token>[\w-]+)/$', UserActivationView.as_view()),
]

【讨论】:

我们将如何设置电子邮件 smpt 等是否有可用的结束代码。我阅读了文档,但无法设置 @SouravRoy 使用 gmail,以下链接显示了所需的设置。请注意,您还必须更改 Gmail 本身的设置(只需谷歌“启用不太安全的应用程序以访问 Gmail”,您将了解如何),链接到示例 settings.py:***.com/questions/59335152/… 错字:result.text() 应该是result.text 这会挂起我的调试 django 服务器 @Hack_Hut 我的服务器也挂了..你能建议一些方法来解决这个问题吗?我问了一个关于这个的问题:Requests to localhost from within a view cause the server to stop responding

以上是关于Djoser 用户激活电子邮件 POST 示例的主要内容,如果未能解决你的问题,请参考以下文章

Django Rest Framework djoser 激活问题

Django Djoser:电子邮件地址重置

如何覆盖 Djoser 基本端点用户/我

Djoser:触发用户帐户激活操作

在 Djoser 和 Rest Framework 中使用自定义字段注册用户

Rails 中的电子邮件激活