登录注册会用户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':'链接已过期'})