django完成天天生鲜用户注册

本文介绍了如何利用Django的内置用户认证系统完成用户注册功能,结合Celery(版本3.1.26.post2)和Redis(2.10.1)实现异步发送激活邮件。在注册过程中,用户需同意协议,前端或后端进行数据校验。若用户名已注册,将返回错误信息。通过Celery异步任务处理邮件发送,以Redis作为任务队列,确保主进程不受影响。在settings中配置相关设置,创建tasks.py文件存放邮件内容。用户注册成功后,Django发送激活邮件,is_active字段设为0,待用户激活。最后,启动Celery worker并运行Redis服务器以处理邮件发送任务。
摘要由CSDN通过智能技术生成

登录注册会用户django自带的用户认证体系
首先:安装celery (我的版本3.1.26.post2),安装redis(2.10.1)
如果版本不对可能会报错

pip install celery
pip install redis

注册功能
使用类视图,因为他自带了get和post等函数,可以不用判断前端method

from django.views import View
class reg(View):
	def get(self,request):
		pass
	def post(self,request):
		pass

get函数中只需要返回一下注册页面

def get(self,request):
		return render(reqeust,'reg.html')

在post函数中需要获取前端用户输入的数据(可以前端校验,也可以后端校验,前端校验的好处是可以减少服务器的压力,避免频繁的请求服务器)

username = request.POST.get('user_name')
password = request.POST.get('pwd')
email = request.POST.get('email')
allow = request.POST.get('allow')

判断用户是否勾选同意协议,如果没有勾选返回前端一个提示

if allow != 'on'return render(request,'register.html',{"error":'请勾选同意'})

后端获取到数据后先判断用户名是否被注册,如果已经注册则会报错

try:
	User.objects.get(username=username)
	return render(request,'register.html',{'error':'账号已存在'})
except User.DoesNotExist:
	user = User.objects.create_user(username,email,password)
	return redirect(reverse('log'))

发送邮件
(使用celery将发送邮件的任务转成异步执行,无需用户等待。使用redis作为队列,将异步任务进行缓存。不影响服务器主进程。)

在settings中需要进行配置

EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend'
EMAIL_HOST = 'smtp.qq.com'
EMAIL_PORT = 25
#发送邮件的邮箱
EMAIL_HOST_USER = '2569792062@qq.com'
#在邮箱中设置的客户端授权密码
EMAIL_HOST_PASSWORD = '自己的授权密码'
#收件人看到的发件人
EMAIL_FROM = '海马生鲜<2569792062@qq.com>'

import djcelery
djcelery.setup_loader()
BROKER_URL = 'redis://127.0.0.1:6379/10'
CELERY_IMPORTS = ('celery_tasks.tasks')

创建一个名为celery_tasks的文件夹,里面创建一个tasks.py用来存储邮件内容

from django.conf import settings
from django.core.mail import send_mail
from celery import Celery
import time
import os
import django
os.environ.setdefault("DJANGO_SETTINGS_MODULE","haima.settings")
django.setup()
# 创建一个Celery类的实例对象
app = Celery('celery_tasks.tasks', broker='redis://127.0.0.1:6379/10')
# 定义任务函数
@app.task()
def send_register_active_mail(email,username,token):
    subject = "海马生鲜欢迎你"
    message = ''
    sender = settings.EMAIL_FROM
    receiver = [email]
    html_message = """
                 <h1>%s  恭喜您成为海马生鲜注册会员</h1><br/><h3>请您在1小时内点击以下链接进行账户激活</h3>
                 <a href="http://127.0.0.1:8000/active/%s">http://127.0.0.1:8000/active/%s</a>
                 """ % (username, token, token)
 	send_mail(subject, message,sender,receiver,html_message=html_message)

    time.sleep(15)

前提准备好后,在view中引用这些

from django.conf import settings
from celery_tasks.tasks import send_register_active_mail
from itsdangerous import TimedJSONWebSignatureSerializer as Serializer

当用户注册成功后,dajngo用第三方服务器发送邮件
django自带的用户认证体系中有一个字段是is_active,当用户没有激活邮件时,值为0,否则为1

user.is_active=0
user.save()

然后调用tasks中的方法,并且发送邮件,跳转到登陆页面

serializer = Serializer(settings.SECRET_KEY,3600)
info = {'confirm':user.id}
token = serializer.dumps(info).decode()
send_register_active_mail.delay(email, username, token)
return redirect(reverse('log'))

在终端使用celery -A celery_tasks.tasks worker -l info运行任务者,并且打开redis

邮件发送成功后,用户需要激活,如果超过一小时,会提示过期

def user_active(request,token):
	serializer = Serializer(settings.SECRET_KEY,3600)
    try:
	    info = serializer.loads(token)
	    user_id = info['confirm']
	    user = User.objects.get(id=user_id)
	    user.is_active = 1
	    user.save()
	    return redirect(reverse("log"))
    except Exception:
    	return render(request,'register.html',{'error':'链接已过期'})
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值