更新找回密码逻辑

This commit is contained in:
virusdefender 2015-10-16 20:49:01 +08:00
parent 3a2f92e896
commit 9f486d4a6f
2 changed files with 62 additions and 23 deletions

View File

@ -6,21 +6,21 @@ from django.shortcuts import render
from django.db.models import Q from django.db.models import Q
from django.conf import settings from django.conf import settings
from django.core.exceptions import MultipleObjectsReturned from django.core.exceptions import MultipleObjectsReturned
from django.utils.timezone import now
from rest_framework.views import APIView from rest_framework.views import APIView
from rest_framework.response import Response from rest_framework.response import Response
from utils.shortcuts import serializer_invalid_response, error_response, success_response, paginate, rand_str from utils.shortcuts import (serializer_invalid_response, error_response,
success_response, error_page, paginate, rand_str)
from utils.captcha import Captcha from utils.captcha import Captcha
from mail.tasks import send_email from mail.tasks import send_email
from envelopes import Envelope
from .decorators import login_required from .decorators import login_required
from .models import User from .models import User
from .serializers import (UserLoginSerializer, UsernameCheckSerializer, from .serializers import (UserLoginSerializer, UsernameCheckSerializer,
UserRegisterSerializer, UserChangePasswordSerializer, UserRegisterSerializer, UserChangePasswordSerializer,
EmailCheckSerializer, UserSerializer, EditUserSerializer, EmailCheckSerializer, UserSerializer, EditUserSerializer,
ApplyResetPasswordSerializer) ApplyResetPasswordSerializer, ResetPasswordSerializer)
from .decorators import super_admin_required from .decorators import super_admin_required
@ -34,13 +34,9 @@ class UserLoginAPIView(APIView):
serializer = UserLoginSerializer(data=request.data) serializer = UserLoginSerializer(data=request.data)
if serializer.is_valid(): if serializer.is_valid():
data = serializer.data data = serializer.data
if "captcha" not in data:
return error_response(u"请填写验证码!")
captcha = Captcha(request) captcha = Captcha(request)
if not captcha.check(data["captcha"]): if not captcha.check(data["captcha"]):
return error_response(u"验证码错误") return error_response(u"验证码错误")
user = auth.authenticate(username=data["username"], password=data["password"]) user = auth.authenticate(username=data["username"], password=data["password"])
# 用户名或密码错误的话 返回None # 用户名或密码错误的话 返回None
if user: if user:
@ -244,21 +240,59 @@ class ApplyResetPasswordAPIView(APIView):
user = User.objects.get(username=data["username"], email=data["email"]) user = User.objects.get(username=data["username"], email=data["email"])
except User.DoesNotExist: except User.DoesNotExist:
return error_response(u"用户不存在") return error_response(u"用户不存在")
if user.reset_password_token_create_time and (now() - user.reset_password_token_create_time).total_seconds() < 20 * 60:
return error_response(u"20分钟内只能找回一次密码")
user.reset_password_token = rand_str() user.reset_password_token = rand_str()
user.reset_password_token_create_time = now()
user.save() user.save()
email_template = codecs.open(settings.TEMPLATES[0]["DIRS"][0] + "utils/reset_password_email.html", "r", "utf-8").read() email_template = codecs.open(settings.TEMPLATES[0]["DIRS"][0] + "utils/reset_password_email.html", "r", "utf-8").read()
email_template = email_template.replace("{{ username }}", user.username).replace("{{ link }}", request.scheme + "://" + request.META['HTTP_HOST'] + "/reset_password/?token=" + user.reset_password_token) email_template = email_template.replace("{{ username }}", user.username).\
replace("{{ website_name }}", settings.WEBSITE_INFO["website_name"]).\
replace("{{ link }}", request.scheme + "://" + request.META['HTTP_HOST'] + "/reset_password/?token=" + user.reset_password_token)
send_email(user.email, user.username, u"qduoj 密码找回邮件", email_template) send_email(settings.WEBSITE_INFO["website_name"],
return success_response(u"邮件发生成功") user.email,
user.username,
settings.WEBSITE_INFO["website_name"] + u" 密码找回邮件",
email_template)
return success_response(u"邮件发送成功")
else: else:
return serializer_invalid_response(serializer) return serializer_invalid_response(serializer)
class ResetPasswordAPIView(APIView): class ResetPasswordAPIView(APIView):
pass def post(self, request):
serializer = ResetPasswordSerializer(data=request.data)
if serializer.is_valid():
data = serializer.data
captcha = Captcha(request)
if not captcha.check(data["captcha"]):
return error_response(u"验证码错误")
try:
user = User.objects.get(reset_password_token=data["token"])
except User.DoesNotExist:
return error_response(u"token 不存在")
if (now() - user.reset_password_token_create_time).total_seconds() > 30 * 60:
return error_response(u"token 已经过期请在30分钟内重置密码")
user.reset_password_token = None
user.set_password(data["password"])
user.save()
return success_response(u"密码重置成功")
else:
return serializer_invalid_response(serializer)
def user_index_page(request, username): def user_index_page(request, username):
return render(request, "oj/account/user_index.html") return render(request, "oj/account/user_index.html")
def auth_page(request):
if not request.user.is_authenticated():
return render(request, "oj/account/oauth.html")
callback = request.GET.get("callback", None)
if not callback:
return error_page(request, u"参数错误")
token = rand_str()
request.user.auth_token = token
return render(request, "oj/account/oauth.html", {"callback": callback, "token": token})

View File

@ -1,14 +1,19 @@
# coding=utf-8 # coding=utf-8
import os
from envelopes import Envelope
SMTP_CONFIG = {"smtp_server": "smtp.mxhichina.com",
"email": "noreply@qduoj.com",
"password": os.environ.get("smtp_password", "111111"),
"tls": False}
def send_email(*args, **kwargs): def send_email(from_name, to_email, to_name, subject, content):
pass envelope = Envelope(from_addr=(SMTP_CONFIG["email"], from_name),
to_addr=(to_email, to_name),
subject=subject,
''' html_body=content)
envelope = Envelope(from_addr=("noreply@qduoj.com", u"qduoj 密码找回邮件", email_template), envelope.send(SMTP_CONFIG["smtp_server"],
to_addr=(user.email, user.username), login=SMTP_CONFIG["email"],
subject=u"qduoj 密码找回邮件", password=SMTP_CONFIG["password"],
html_body=email_template) tls=SMTP_CONFIG["tls"])
envelope.send("smtp.mxhichina.com", login="noreply@qduoj.com", password="092122302Zarpe2015", tls=False)
'''