[Mobilar] 04 - Multiple Users: email and password reset

Ref: Python Django Tutorial: Full-Featured Web App Part 12 - Email and Password Reset

注册的方法和设计技巧。

 

 

原生方案

一、流程

大概会涉及到几个步骤。

  • 第一步、填写邮箱

文件 users/password_reset.html

{% extends "blog/base.html" %}
{% load crispy_forms_tags %}
{% block content %}
    <div class="content-section">
        <form method="POST">
            {% csrf_token %}
            <fieldset class="form-group">
                <legend class="border-bottom mb-4">Reset Password</legend>
                {{ form|crispy }}
            </fieldset>
            <div class="form-group">
                <button class="btn btn-outline-info" type="submit">Request Password Reset</button>
            </div>
        </form>
    </div>
{% endblock content %}

 

  • 第二步、确认已发送

这里需要提前注册 一个 google账户,使用其对应的服务。

文件 settings.py

EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend'
EMAIL_HOST = 'smtp.gmail.com'
EMAIL_PORT = 587
EMAIL_USE_TLS = True
EMAIL_HOST_USER     = os.environ.get('EMAIL_USER')
EMAIL_HOST_PASSWORD = os.environ.get('EMAIL_PASS')

文件 users/password_reset_done.html

{% extends "blog/base.html" %}
{% block content %}
    <div class="alert alert-info">
        An email has been sent with instructions to reset your password
    </div>
{% endblock content %}

 

  • 第三步、修改密码

 

点击链接跳转到 “密码重置” 界面。注意下面的地址栏,<uidb64>保留,<token>消失,变为了 set-password/。

文件 password_reset_confirm.html

{% extends "blog/base.html" %}
{% load crispy_forms_tags %}
{% block content %}
    <div class="content-section">
        <form method="POST">
            {% csrf_token %}
            <fieldset class="form-group">
                <legend class="border-bottom mb-4">Reset Password</legend>
                {{ form|crispy }}  # <---- 可见,中间的部分是系统默认的 一个小组件,在此处一行代码搞定了
            </fieldset>
            <div class="form-group">
                <button class="btn btn-outline-info" type="submit">Reset Password</button>
            </div>
        </form>
    </div>
{% endblock content %}

 

  • 第四步、密码修改成功

文件 password_reset_complete.html

{% extends "blog/base.html" %}
{% block content %}
    <div class="alert alert-info">
        Your password has been set.
    </div>
    <a href="{% url 'login' %}">Sign In Here</a>
{% endblock content %}

 

 

二、路由

根据以上流程,再设置匹配的路由,如下。

文件 ./django_project/urls.py

urlpatterns = [
    path('admin/',    admin.site.urls),
    path('register/', user_views.register, name='register'),
    path('profile/',  user_views.profile,  name='profile'),
    path('login/',    auth_views.LoginView.as_view(template_name='users/login.html'),   name='login'),
    path('logout/',   auth_views.LogoutView.as_view(template_name='users/logout.html'), name='logout'),
path(
'password-reset/', auth_views.PasswordResetView.as_view( template_name='users/password_reset.html' ), name='password_reset'),
path(
'password-reset/done/', auth_views.PasswordResetDoneView.as_view( template_name='users/password_reset_done.html' ), name='password_reset_done'),
path(
'password-reset-confirm/<uidb64>/<token>/', auth_views.PasswordResetConfirmView.as_view( template_name='users/password_reset_confirm.html' ), name='password_reset_confirm'),
path(
'password-reset-complete/', auth_views.PasswordResetCompleteView.as_view( template_name='users/password_reset_complete.html' ), name='password_reset_complete'),
path(
'', include('blog.urls')), ]

 

 

 

AWS Cognito 方案

 

 /* implement */

 

 未来进一步需要考虑的,替代“原生方案”。

 

posted @ 2021-02-07 14:50  郝壹贰叁  阅读(75)  评论(0编辑  收藏  举报