电子邮件django的注册无效

问题描述 投票:0回答:1

我想在Django中通过电子邮件验证实现注册。

  1. 运行服务器-

    pyrun =“ python manage.py runserver 127.0.0.1:8001”

  2. 填写完整的注册表---确定

  3. 已收到带有链接的电子邮件---确定

    http://127.0.0.1/accounts/register/activate/mosk:tQUC9n5kMrmoVSZv4qy6DCAUjaM/

  4. 点击链接---收到错误

    无法访问此站点127.0.0.1拒绝连接

我该如何解决错误?

似乎urls.py可以,我应该在ALLOWED_HOSTS中添加一些内容

图像enter image description here

settings.py

DEBUG = True
ALLOWED_HOSTS = ['127.0.0.1']

STATIC_URL = '/static/'
STATIC_ROOT = os.path.join(BASE_DIR, 'static')
AUTH_USER_MODEL = 'blog.AdvUser'

EMAIL_USE_TLS = True
EMAIL_HOST = 'smtp.gmail.com'
EMAIL_PORT = 587
EMAIL_HOST_USER = '[email protected]'
EMAIL_HOST_PASSWORD = '*****'
DEFAULT_FROM_EMAIL = 'Alex'
DEFAULT_TO_EMAIL = '[email protected]'
EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend'

models.py

from django.db import models
from django.contrib.auth.models import AbstractUser
from django.dispatch import Signal
from .utilities import send_activation_notification


class AdvUser(AbstractUser):
    is_activated = models.BooleanField(default=True, db_index=True,
                                       verbose_name='Пpoшeл активацию?')
    send_messages = models.BooleanField(default=True, verbose_name='Слать оповещения о новых комментариях?')

class Meta(AbstractUser.Meta):
        pass


user_registrated = Signal(providing_args=['instance'])


def user_registrated_dispatcher(sender, **kwargs):
    send_activation_notification(kwargs['instance'])


user_registrated.connect(user_registrated_dispatcher)

forms.py

class RegisterUserForm(forms.ModelForm):
    email = forms.EmailField(required=True, label="Email address")
    password1 = forms.CharField(label="Password", widget=PasswordInput,
                                help_text=password_validation.password_validators_help_text_html())
    password2 = forms.CharField(label="Password", widget=PasswordInput,
                                help_text=password_validation.password_validators_help_text_html())

    def clean_password1(self):
        password1 = self.cleaned_data['password1']
        if password1:
            password_validation.validate_password(password1)
        return password1

    def clean(self):
        super().clean()
        password1 = self.cleaned_data.get('password1')
        password2 = self.cleaned_data.get('password2')
        if password1 and password2 and password1 != password2:
            errors = {'password2': ValidationError('Введённые пароли не совпадают', code='password_mismatch')}
            raise ValidationError(errors)
        else:
            return self.cleaned_data


    def save(self, commit=True):
        user = super().save(commit=False)
        user.set_password(self.cleaned_data['password1'])
        user.is_active = False
        user.is_activated = False
        if commit:
            user.save()
        user_registrated.send(RegisterUserForm, isinstance=user)
        return user

    class Meta:
        model = AdvUser
        fields = ('username', 'email', 'password', 'password2',
                  'first_name', 'last_name', 'send_messages')

urls.py

from .views import BBLoginView, BBLogoutView, profile, RegisterUserView, RegisterDoneView, user_activate

urlpatterns = [
    path('', views.post_list, name='post_list'),
    path('accounts/login/', BBLoginView.as_view(), name='login'),
    path('accounts/profile/', profile, name='profile'),
    path('accounts/logout/', BBLogoutView.as_view(), name='logout'),

    path('accounts/register/done', RegisterDoneView.as_view(), name='register_done'),
    path('accounts/register/', RegisterUserView.as_view(), name='register'),
    path('accounts/register/activate/<str:sign>/', user_activate, name='register_activate'),
]

views.py

def post_list(request):
    return render(request, 'blog/post_list.html', {})


class BBLoginView(LoginView):
    template_name = 'blog/login.html'

class BBLogoutView(LoginRequiredMixin, LogoutView):
    template_name = 'blog/logout.html'

@login_required
def profile(request):
    return render(request, 'blog/profile.html')

class RegisterUserView(CreateView):
    model = AdvUser
    template_name = 'blog/register_user.html'
    form_class = RegisterUserForm
    success_url = '/register_done'

class RegisterDoneView(TemplateView):
    template_name = "blog/register_done.html"


def user_activate(request, sign):
    try:
        username = signer.unsign(sign)
    except:
        return render(request, 'blog/bad_signature.html')
    user = get_object_or_404(AdvUser, username=username)
    if user.is_activated:
        template = 'blog/user_is_activated.html'
    else:
        template = 'blog/activation_done.html'
        user.is_active = True
        user.is_activated = True
        user.save()
    return render(request, template)
python django
1个回答
0
投票

通过变更解决了问题

def send_activation_notification(user):
    if ALLOWED_HOSTS:
        #host = "http://" + ALLOWED_HOSTS[0] # BAD VERSION
        host = "http://localhost:8001" # GOOD VERSION FOR ME
    else:
        ...

您有更好的解决方案吗?

© www.soinside.com 2019 - 2024. All rights reserved.