zoukankan      html  css  js  c++  java
  • 完成celery简单发送注册邮件

    这个是基于Django原始的celery

    启动celery指令

    celery -A celery_test worker -l info -P eventlet

    大部分代码,具体代码看业务

    在django项目celery_test/celery_test/下创建celery.py文件,配置以下内容:

    import os
    from celery import Celery
    # 把celery和django进行组合,识别和加载django的配置文件
    os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'opwf.settings')
    # 创建celery实例
    app = Celery('opwf')
    # 指定celery消息队列的配置
    app.config_from_object('opwf.config', namespace='CELERY')
    # 从所有的django-app中加载任务
    app.autodiscover_tasks()
    
    
    @app.task(bind=True)
    def debug_task(self):
        print('Request: {0!r}'.format(self.request))
    

    在django项目celery_test/celery_test/下创建config.py文件,配置以下内容:

    # 消息中间人设置
    broker_url = 'redis://127.0.0.1:6379/15'
    # 结果存储设置
    result_backend = 'redis://127.0.0.1:6379/14'
    

    在django项目celery_test/celery_test/下 init.py 中写入以下内容:

    # 绝对引用,使我们的celery模块不会与原始的celery冲突
    from __future__ import absolute_import, unicode_literals
    # 加入绝对引入以后,导入当前模块下的内容方法: from xx import xx as xx
    from .celery import app as celery_app
    
    __all__ = ('celery_app',)
    

    在settings.py中配置发邮件的内容:

    # 配置邮件发送
    EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend'
    EMAIL_HOST = 'smtp.163.com'  # 如果为163邮箱,设置为smtp.163.com
    EMAIL_PORT = 25  # 或者 465/587是设置了 SSL 加密方式
    # 发送邮件的邮箱
    EMAIL_HOST_USER = 'wangsai_python@163.com'
    # 在邮箱中设置的客户端授权密码
    EMAIL_HOST_PASSWORD = 'LSJSTWQLCQMAWEWX'  # 第三方登陆使用的授权密码
    EMAIL_USE_TLS = True  # 这里必须是 True,否则发送不成功
    # 收件人看到的发件人, 必须是一直且有效的
    EMAIL_FROM = '公司老董<wangsai_python@163.com>'
    DEFAULT_FROM_EMAIL = EMAIL_HOST_USER
    

    在django的app中创建tasks.py文件,在这里写入异步任务内容:

    # -*- coding: utf-8 -*-
    # 绝对引用,使我们的celery模块不会与原始的celery冲突
    from __future__ import absolute_import, unicode_literals
    # 导入原始的celery模块中shared_task from xx import xx
    from celery import shared_task
    # 使用django内置函数发送邮件
    from django.core.mail import send_mail
    # 导入django的settings
    from django.conf import settings
    
    
    @shared_task
    def send_mail_task(username,email):
        subject = '工单通知'
        message = ''
        from_email = settings.EMAIL_FROM
        recipient_list = [email]
        html_message = '<h1>工单审批通知</h1>'.format(
            username,)
        send_mail(subject, message, from_email, recipient_list, html_message=html_message)
    

    在django的app下的views.py中调用tasts下的任务

    token_serializer = TimedJSONWebSignatureSerializer(settings.SECRET_KEY, 1800)
    login_serializer = TimedJSONWebSignatureSerializer(settings.SECRET_KEY, 86400)
    from myutils.tasks import send_meail_task
    from myutils.tasks import send_meail_task
    from django.conf import settings
    
    class UserView(APIView):
        def post(self, request):
            username = request.data.get('username')
            password: object = request.data.get('password')
            pwd = request.data.get('pwd')
            phone = request.data.get('phone')
            email = request.data.get('email')
            rola = request.data.get('rola')
    
            # 对手机号进行验证
            phone_re = re.compile(r'^1(3d|4[4-9]|5[0-35-9]|6[67]|7[013-8]|8[0-9]|9[0-9])d{8}$')
            if not re.search(phone_re, phone):
                return Response({'msg': '手机号不符合规范', 'code': 400})
            # 对用户名进行验证
            users = User.objects.filter(username=username)
            if users:
                return Response({'code': 300, 'msg': '用户名重复'})
            # 对密码进行验证
            if password != pwd:
                return Response({'code': 300, 'msg': '第一次密码与第二次密码错误'})
    
            # 构造数据
            data = {
                'username': username,
                'password': make_password(password),
                'pwd': pwd,
                'phone': phone,
                'email': email,
                'rola': rola,
            }
            # 对数据进行序列化
            obj_all = UserSer(data=data)
            # 对数据进行验证
            if obj_all.is_valid():
                obj_all.save()
                # 同步发邮箱
                user_info = {'user_id': obj_all.data.get('user_id')}
                token = token_serializer.dumps(user_info).decode()
                send_meail_task.delay(username, token, email)
                r.incr(username)
                return Response({'code': 200, 'msg': '注册成功'})
            else:
                print(obj_all.errors)
                return Response({'code': 400, 'msg': '注册失败'})
    

    需要的model类

  • 相关阅读:
    flask url_for后没有带端口号
    [Flask]通过render_form快捷渲染表单
    [Flask]使用sqlite数据库
    jmeter参数化读取数据进行多次运行
    eclipse 集成jdk
    创建一个gradle项目
    gradle的安装
    springmvc--jsp页面乱码
    APP专项测试使用到的工具
    robotframework实战三--自定义关键字
  • 原文地址:https://www.cnblogs.com/wangxiaosai/p/14090894.html
Copyright © 2011-2022 走看看