Django-自定义用户与认证(celery异步发送验证邮件)做个记录

后端思路流程:

1.自定义用户模型(邮箱)

2.用户认证(celery异步发送验证邮件)

    2.1 解析全部参数

    2.2 校验密码格式 确认密码

    2.3 判断用户名是否可用

    2.4 可用 创建用户 ,生成验证链接 ,发送邮件异步调用

    2.5 中间会使用到缓存、celery , 配置缓存 、celery

3.Celery 是一个 基于python开发的分布式异步消息任务队列,通过它可以轻松的实现任务的异步处理

具体步骤:

1.在model中定义用户模型(is_active**),写一个继承自(AbstractUser)的类,追加需要的字段,在项目settings文件中加入:

AUTH_USER_MODEL = 'app的名字.用户类'

class MyUser(AbstractUser):
    email = models.CharField(
        max_length=251,
        verbose_name= "邮箱",
        unique=True,
    )
    is_active = models.BooleanField(
        default=False
    )

2.view中注册API

from django.views.generic import View
class RegisterAPI(View):

    def get(self,req):
        return render(req,"register.html")

    def post(self,req):
        # 1.解析全部参数
        params = req.POST
        name = params.get("name")
        pwd = params.get("pwd")
        email =params.get("email")
        confirm_pwd = params.get("confirm_pwd")
        # 2.校验密码格式
        if pwd and confirm_pwd and pwd == confirm_pwd:
        # 3.判断用户名是否可用
            if MyUser.objects.filter(username=name).exists():
                return render(req,"login.html")
            else:
        # 3.创建用户
                user = MyUser.objects.create_user(
                      username=name,
                      email=email,
                      password=pwd,
                      is_active=False
                )
        # 生成验证链接
                url = "http://" + req.get_host() + '/protice/confirm/' + get_unique_str()
        # 发送邮件 异步调用
                send_verify_mail.delay(url,user.id,email)
                return render(req,"login.html")

3.完成验证链接 (异步发送邮件) 在需要使用异步任务的APP目录下 新建一个tasks.py文件  

   注意:使用celery需要建表python manage.py migrate 每次修改tasks中的内容 需要重启

启动:python manage.py celery worker --loglevel=info (或者celery -A 你的工程名 worker -l info)(需要启动才能使用 不然会拒绝)

from celery import task
from django.conf import settings
from django.core.mail import send_mail
from django.core.cache import cache, caches
from django.template import loader
cache = caches["confirm"]
# 拿缓存表
@task
def send_verify_mail(url,user_id,reciever):
    title = "验证邮件"
    content = ""
    template = loader.get_template("email_template.html")
    html = template.render({"url":url})
    email_from = settings.DEFAULT_FROM_EMAIL
    send_mail(title,content,email_from,[reciever],html_message=html)
    # 设置缓存 user_id 为value 生成的随机字符串为key ,过期时间(也可以使用email作为value)
    cache.set(url.split("/")[-1],user_id,settings.VERIFY_CODE_MAX_AGE)

4.验证函数:在页面靠前的位置获取缓存表 confirm 是下面缓存配置中表的名字(得要拿缓存表**)

cache = caches['confirm']
def confirm(req,uuid_str):
    # 在最前面要拿一下缓存表
    # 去缓存中尝试拿数据
    user_id = cache.get(uuid_str)
    # 如果我们拿到用户id 修改is_active字段
    if user_id:
        user = MyUser.objects.get(pk=int(user_id))
        user.is_active=True
        user.save()
        return redirect(reverse("protice:login"))
    else:
        return HttpResponse("

链接失效

")

配置:

1.settings 中celery的配置(未使用先安装)

ALLOWED_HOSTS = ['*']
INSTALLED_APPS = (
	  ...
	  'djcelery',
‘自己的APP’
	}
import djcelery
djcelery.setup_loader()
BROKER_URL='redis://localhost:6379/1' #任务队列存放的位置
CELERY_CONCURRENCY=2(设置worker的并发数量)
CELERY_RESULT_BACKEND = 'redis://localhost:6379/2' #结果存放的位置

2.settings 中缓存的配置

# 配置缓存
CACHES = {
    "default": {
        "BACKEND": "django_redis.cache.RedisCache",
        "LOCATION": "redis://127.0.0.1:6379/1",
        "OPTIONS": {
            "CLIENT_CLASS": "django_redis.client.DefaultClient",
        }
    },
    "confirm": {
                "BACKEND": "django_redis.cache.RedisCache",
                "LOCATION": "redis://127.0.0.1:6379/2",
                "OPTIONS": {
                    "CLIENT_CLASS": "django_redis.client.DefaultClient",
                }
            }
}

# confirm是缓存表的名字

3.settings 中发邮件的配置

# 发邮件配置
EMAIL_USE_SSL = True  # 加密手段
EMAIL_HOST = 'smtp.163.com'  # 如果是 163 改成 smtp.163.com
EMAIL_PORT = 465  # SMPT的端口 不能改
EMAIL_HOST_USER = "xxxxx"  # 账号
EMAIL_HOST_PASSWORD = "xxxx"  # 授权码
DEFAULT_FROM_EMAIL = EMAIL_HOST_USER  # 默认邮件的发件人

4.settings.py的同级目录下新建celery.py

from __future__ import absolute_import #绝对路径导入
from celery import Celery
from django.conf import settings
import os

#设置系统的环境配置用的是Django的
os.environ.setdefault("DJANGO_SETTING_MODULE", "工程名字.settings")

#实例化celery
app = Celery('mycelery')

app.conf.timezone = "Asia/Shanghai" #设置时区

#指定celery的配置来源 用的是项目的配置文件settings.py
app.config_from_object("django.conf:settings")

#让celery 自动去发现我们的任务(task)
app.autodiscover_tasks(lambda : settings.INSTALLED_APPS) #你需要在app目录下 新建一个叫tasks.py(一定不要写错)文件

5.APP中的urls.py的配置

from django.conf.urls import url
from .views import *

urlpatterns = [
    url(r"^register/",RegisterAPI.as_view(),name="register"),
    url(r"^login$",my_login,name="login"),
    url(r"^confirm/(.*)",confirm)
]

 

你可能感兴趣的:(Django-自定义用户与认证(celery异步发送验证邮件)做个记录)