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)
]