2

我只是从官方django-rest-auth网站下载演示,并试图使用,但一些API端点不工作。django-rest-auth注册/验证电子邮件/不工作

我成功注册(登记)与宁静的API的用户,我拿到钥匙对应:

`{"key":"e96496ecb7fbe85d5ab60fe5d5f9a15b33a967fe"}` 

和用户存在(当我在数据库中查询),我还可以得到与验证链接的电子邮件,但是当我尝试验证其电子邮件与REST API:

`curl -X POST http://127.0.0.1:9003/rest-auth/registration/verify-email/ -d "key=e96496ecb7fbe85d5ab60fe5d5f9a15b33a967fe"` 

我得到:

`{"detail":"Not found."}` 

其中ia m犯错误。这只是演示,我没有做任何事情只是安装,设置发送电子邮件,主机和运行服务器。

而且当我在电子邮件中的链接点击打开页面,确认按钮,当我点击确认我得到:

`Using the URLconf defined in demo.urls, Django tried these URL patterns, in this order: 
^$ [name='home'] 
^signup/$ [name='signup'] 
^email-verification/$ [name='email-verification'] 
^login/$ [name='login'] 
^logout/$ [name='logout'] 
^password-reset/$ [name='password-reset'] 
^password-reset/confirm/$ [name='password-reset-confirm'] 
^user-details/$ [name='user-details'] 
^password-change/$ [name='password-change'] 
^password-reset/confirm/(?P<uidb64>[0-9A-Za-z_\-]+)/(?P<token>[0-9A-Za-z]{1,13}-[0-9A-Za-z]{1,20})/$ [name='password_reset_confirm'] 
^rest-auth/ 
^rest-auth/registration/ 
^account/ 
^admin/ 
^accounts/profile/$ [name='profile-redirect'] 
^docs/$ [name='api_docs'] 
The current path, accounts/login/, didn't match any of these.` 

为什么这也不起作用?这是演示我犯了什么错误?

请帮忙!

UPDATE1:

这里是settings.py文件:

`""" 
Django settings for demo project. 

For more information on this file, see 
https://docs.djangoproject.com/en/1.7/topics/settings/ 

For the full list of settings and their values, see 
https://docs.djangoproject.com/en/1.7/ref/settings/ 
""" 

# Build paths inside the project like this: os.path.join(BASE_DIR, ...) 
import os 

BASE_DIR = os.path.dirname(os.path.dirname(__file__)) 

# Quick-start development settings - unsuitable for production 
# See https://docs.djangoproject.com/en/1.7/howto/deployment/checklist/ 

# SECURITY WARNING: keep the secret key used in production secret! 
SECRET_KEY = '[email protected]!%e0=tynp+i6+q%$)[email protected]$t(eulqurym_b=48z82&5n' 

# SECURITY WARNING: don't run with debug turned on in production! 
DEBUG = True 

ALLOWED_HOSTS = ['127.0.0.1'] 

# Application definition 

INSTALLED_APPS = (
    'django.contrib.admin', 
    'django.contrib.auth', 
    'django.contrib.contenttypes', 
    'django.contrib.sessions', 
    # 'django.contrib.messages', 
    'django.contrib.staticfiles', 
    'django.contrib.sites', 

    'rest_framework', 
    'rest_framework.authtoken', 
    'rest_auth', 

    'allauth', 
    'allauth.account', 
    'rest_auth.registration', 
    'allauth.socialaccount', 
    'allauth.socialaccount.providers.facebook', 
    'rest_framework_swagger', 
) 

MIDDLEWARE_CLASSES = (
    'django.contrib.sessions.middleware.SessionMiddleware', 
    'django.middleware.common.CommonMiddleware', 
    'django.middleware.csrf.CsrfViewMiddleware', 
    'django.contrib.auth.middleware.AuthenticationMiddleware', 
    'django.contrib.auth.middleware.SessionAuthenticationMiddleware', 
    'django.contrib.messages.middleware.MessageMiddleware', 
    'django.middleware.clickjacking.XFrameOptionsMiddleware', 
) 

ROOT_URLCONF = 'demo.urls' 

WSGI_APPLICATION = 'demo.wsgi.application' 

# Database 
# https://docs.djangoproject.com/en/1.7/ref/settings/#databases 

DATABASES = { 
    'default': { 
     'ENGINE': 'django.db.backends.sqlite3', 
     'NAME': os.path.join(BASE_DIR, 'db.sqlite3'), 
    } 
} 

# Internationalization 
# https://docs.djangoproject.com/en/1.7/topics/i18n/ 

LANGUAGE_CODE = 'en-us' 

TIME_ZONE = 'UTC' 

USE_I18N = True 

USE_L10N = True 

USE_TZ = True 

# Static files (CSS, JavaScript, Images) 
# https://docs.djangoproject.com/en/1.7/howto/static-files/ 

STATIC_URL = '/static/' 

# TEMPLATE_DIRS = [os.path.join(BASE_DIR, 'templates')] 

TEMPLATES = [ 
    { 
     'BACKEND': 'django.template.backends.django.DjangoTemplates', 
     'DIRS': [os.path.join(BASE_DIR, 'templates'), ], 
     'APP_DIRS': True, 
     'OPTIONS': { 
      'context_processors': [ 
       'django.template.context_processors.debug', 
       'django.template.context_processors.request', 
       'django.contrib.auth.context_processors.auth', 
       'django.contrib.messages.context_processors.messages', 
      ], 
     }, 
    }, 
] 

REST_SESSION_LOGIN = True 
#EMAIL_BACKEND = 'django.core.mail.backends.console.EmailBackend' 
SITE_ID = 1 
ACCOUNT_EMAIL_REQUIRED = True 
ACCOUNT_AUTHENTICATION_METHOD = 'email' 
ACCOUNT_EMAIL_VERIFICATION = 'optional' 

REST_FRAMEWORK = { 
    'DEFAULT_AUTHENTICATION_CLASSES': (
     'rest_framework.authentication.SessionAuthentication', 
     'rest_framework.authentication.TokenAuthentication', 
    ) 
} 

SWAGGER_SETTINGS = { 
    'LOGIN_URL': 'login', 
    'LOGOUT_URL': 'logout', 
} 

DEFAULT_FROM_EMAIL = '[email protected]' 
EMAIL_HOST = 'smtp.mail.xxxx.com' 
EMAIL_PORT = 587 
EMAIL_HOST_USER = '[email protected]' 
EMAIL_HOST_PASSWORD = 'xxxxx' 
EMAIL_USE_TLS = True` 

,这里是urls.py

from django.conf.urls import include, url 
from django.contrib import admin 
from django.views.generic import TemplateView, RedirectView 

from rest_framework_swagger.views import get_swagger_view 

urlpatterns = [ 
    url(r'^$', TemplateView.as_view(template_name="home.html"), name='home'), 
    url(r'^signup/$', TemplateView.as_view(template_name="signup.html"), 
     name='signup'), 
    url(r'^email-verification/$', 
     TemplateView.as_view(template_name="email_verification.html"), 
     name='email-verification'), 
    url(r'^login/$', TemplateView.as_view(template_name="login.html"), 
     name='login'), 
    url(r'^logout/$', TemplateView.as_view(template_name="logout.html"), 
     name='logout'), 
    url(r'^password-reset/$', 
     TemplateView.as_view(template_name="password_reset.html"), 
     name='password-reset'), 
    url(r'^password-reset/confirm/$', 
     TemplateView.as_view(template_name="password_reset_confirm.html"), 
     name='password-reset-confirm'), 

    url(r'^user-details/$', 
     TemplateView.as_view(template_name="user_details.html"), 
     name='user-details'), 
    url(r'^password-change/$', 
     TemplateView.as_view(template_name="password_change.html"), 
     name='password-change'), 


    # this url is used to generate email content 
    url(r'^password-reset/confirm/(?P<uidb64>[0-9A-Za-z_\-]+)/(?P<token>[0-9A-Za-z]{1,13}-[0-9A-Za-z]{1,20})/$', 
     TemplateView.as_view(template_name="password_reset_confirm.html"), 
     name='password_reset_confirm'), 

    url(r'^rest-auth/', include('rest_auth.urls')), 
    url(r'^rest-auth/registration/', include('rest_auth.registration.urls')), 
    url(r'^account/', include('allauth.urls')), 
    url(r'^admin/', include(admin.site.urls)), 
    url(r'^accounts/profile/$', RedirectView.as_view(url='/', permanent=True), name='profile-redirect'), 
    url(r'^docs/$', get_swagger_view(title='API Docs'), name='api_docs') 
] 

UPDATE2:

我想我找到了索姆ething。在确认电子邮件,我得到的链接看起来像:

http://127.0.0.1:9003/account/confirm-email/MQ:1d2Go5:SHdLaJz9Pa1HluHw_Djr26jm3Q8/ 

现在如果我使用MQ:1d2Go5:SHdLaJz9Pa1HluHw_Djr26jm3Q8在REST API我得到了成功响应的关键。但现在我不知道那是什么,我从卷曲反应得到的,什么是关键,我从确认电子邮件中的链接一键搞定:

从卷曲响应键:e96496ecb7fbe85d5ab60fe5d5f9a15b33a967fe(这个值存放在数据库中的表authtoken_token

MQ:1d2Go5:从确认电子邮件中的链接

关键SHdLaJz9Pa1HluHw_Djr26jm3Q8

请给我解释一下差异

+0

您是否在'urls.py'中添加了'rest_auth.registration.urls'? –

+0

是的,我做了网址(r'^ rest-auth/registration /',include('rest_auth.registration.urls')),毕竟这是正式的演示。注册也适用于其他API,但验证电子邮件不起作用。也许还有更多的设置? –

+0

你有没有检查过installed_apps设置? –

回答

0

我发现了什么是解决方案。这不是问题在设置这是我的理解什么钥匙去哪里问题。

您从响应{“key”:“e96496ecb7fbe85d5ab60fe5d5f9a15b33a967fe”}中得到的关键是您需要在标题中为每个需要验证的api调用使用的关键字。但是作为确认链接的一部分的确认电子邮件“MQ:1d2Go5:SHdLaJz9Pa1HluHw_Djr26jm3Q8”得到的钥匙仅用于验证。相反,您点击电子邮件中的确认链接,您可以取得该部分(关键),并通过restful api验证您的帐户。就这样。有两个不同的键。一个是认证密钥是重要的,你总是需要保留它并发送请求,所以服务器知道你已经登录,第二个密钥仅用于验证帐户,并且当你注册新帐户时只需要使用它一次,需要验证它。您可以通过单击确认电子邮件中的链接对其进行验证,或者从该链接获取密钥并手动将其与验证API调用发送以验证您的新帐户。

+0

如何更改电子邮件中发送的网址?那个设置在哪里? –

+0

您不需要更改该URL。该URL由django自动生成,并通过帐户电子邮件发送,需要进行验证。如果你想要,你可以用不同的文本更改电子邮件模板,但会生成网址。 –

0

我有完全相同的问题,那么我根本就添加以下设置:

ACCOUNT_EMAIL_VERIFICATION = 'mandatory' ACCOUNT_EMAIL_REQUIRED = True