from django.http import JsonResponse# 定义一个装饰器,验证是否已经登陆def login_required(func): # func:是视图函数 def wrapper(request, *args, **kwargs): # 添加功能代码 if request.user.is_authenticated: return func(request, *args, **kwargs) else: return JsonResponse({'code': 400, 'errmsg': '您未登陆!'}, status=401) return wrapper
from shop.utils.views import login_requiredfrom django.utils.decorators import method_decoratorclass UserInfoView(View): @method_decorator(login_required) def get(self, request): # 1、获取用户对象 user = request.user # 2、构造响应数据返回 return JsonResponse({ 'code': 0, 'errmsg': 'ok', 'info_data': { 'username': user.username, 'mobile': user.mobile, 'email': user.email, # email模型没写,暂时先注释 'email_active': user.email_active # email模型没写,暂时先注释 } })
re_path(r'^info/$', UserInfoView.as_view()),
from django.db import modelsfrom django.contrib.auth.models import AbstractUserfrom itsdangerous import TimedJSONWebSignatureSerializer,BadSignaturefrom django.conf import settingsclass User(AbstractUser): mobile = models.CharField(max_length=11, unique=True, verbose_name='手机号') email_active = models.BooleanField(default=False, verbose_name='邮箱验证状态') class Meta: db_table = 'tb_users' verbose_name = '用户' verbose_name_plural = verbose_name def __str__(self): return self.username # 用户模型类中封装该方法 def generate_verify_email_url(self): """ 生成当前用户的令牌;并且拼接邮箱确认的连接; :return: 返回确认连接 """ serializer = TimedJSONWebSignatureSerializer(secret_key=settings.SECRET_KEY) user_info = {'user_id': self.id, 'email': self.email} token = serializer.dumps(user_info) # b'....' verify_url = settings.EMAIL_VERIFY_URL + token.decode() return verify_url # 校验token值,返回用户对象 @staticmethod 不访问实例属性、不调用实例方法 @staticmethod def check_verify_email_token(token): """ 校验token值 :param token: token值 :return: 用户对象 或 None """ serializer = TimedJSONWebSignatureSerializer(secret_key=settings.SECRET_KEY) try: user_info = serializer.loads(token) except BadSignature as e: print(e) return None user_id = user_info.get('user_id') try: user = User.objects.get(pk=user_id) except User.DoesNotExist as e: print(e) return None return user
class UserInfoView(View): @method_decorator(login_required) def get(self, request): # 1、获取用户对象 user = request.user # 2、构造响应数据返回 return JsonResponse({ 'code': 0, 'errmsg': 'ok', 'info_data': { 'username': user.username, 'mobile': user.mobile, 'email': user.email, # email模型添加后写 'email_active': user.email_active # email模型添加后写 } })
# 发送短信的相关设置, 这些设置是当用户没有发送相关字段时, 默认使用的内容:# 发送短信必须进行的设置:EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend'# 我们使用的 smtp服务器 地址EMAIL_HOST = 'smtp.163.com'# 端口号EMAIL_PORT = 25 # 或者 465/587是设置了 SSL 加密方式 163邮箱465/587有限制,QQ邮箱,可以用。# 下面的内容是可变的, 随后台设置的不同而改变:# 发送邮件的邮箱EMAIL_HOST_USER = '你的163邮箱'# 在邮箱中设置的客户端授权密码EMAIL_HOST_PASSWORD = '授权码' # 如果重新设置了新的授权码,直接使用最新的授权码即可EMAIL_USE_TLS = True # 这里必须是 True,否则发送不成功# 收件人看到的发件人EMAIL_FROM = '阿尔法商城<你的163邮箱>'# 邮箱验证链接EMAIL_VERIFY_URL = 'http://127.0.0.1/success_verify_email.html?token='
from django.core.mail import send_mailfrom django.conf import settingsfrom celery_tasks.main import app@app.task(name='send_verify_email')def send_verify_email(to_email, verify_url): subject = '阿尔法商城邮箱验证' html_message = '<p>尊敬的用户您好!</p>' \ '<p>感谢您使用阿尔法商城。</p>' \ '<p>您的邮箱为:%s 。请点击此链接激活您的邮箱:</p>' \ '<p><a href="%s">%s<a></p>' % (to_email, verify_url, verify_url) send_mail( subject, '', settings.EMAIL_FROM, [to_email], html_message=html_message )
import osos.environ.setdefault( 'DJANGO_SETTINGS_MODULE', 'settings.dev_settings',)from celery import Celeryapp = Celery("shop")app.config_from_object('celery_tasks.config')app.autodiscover_tasks([ 'celery_tasks.sms', 'celery_tasks.email',])
from celery_tasks.email.tasks import send_verify_email# 更新邮箱class EmailView(View): @method_decorator(login_required) def put(self, request): # 1、提取参数 data = json.loads(request.body.decode()) email = data.get('email') # 2、校验参数 if not email: return JsonResponse({'code': 400, 'errmsg': '缺少email'}) if not re.match(r'^[a-z0-9][\w\.\-]*@[a-z0-9\-]+(\.[a-z]{2,5}){1,2}$', email): return JsonResponse({'code': 400, 'errmsg': '邮箱格式有误!'}) # 3、数据处理(部分更新) ———— 更新邮箱 user = request.user try: user.email = email user.email_active = False user.save() except Exception as e: print(e) # ======发送邮箱验证邮件======= verify_url = user.generate_verify_email_url() send_verify_email.delay(email, verify_url) # 异步调用! # 4、构建响应 return JsonResponse({'code': 0, 'errmsg': 'ok'})
class VerifyEmailView(View): def put(self, request): # 1、提取查询字符串中token token = request.GET.get('token') # 2、校验token user = User.check_verify_email_token(token) if not user: return JsonResponse({'code': 400, 'errmsg': '验证邮件无效!'}) # 3、如果token有效,把邮箱的激活状态设置为True user.email_active = True user.save() return JsonResponse({'code': 0, 'errmsg': '邮箱激活成功!'})