精华内容
下载资源
问答
  • I have an application in Django, that needs to send a large number of emails to users in various use cases. I don't want to handle this synchronously within the application for obvious reasons.Has any...

    I have an application in Django, that needs to send a large number of emails to users in various use cases. I don't want to handle this synchronously within the application for obvious reasons.

    Has anyone any recommendations for a message queuing server which integrates well with Python, or they have used on a Django project? The rest of my stack is Apache, mod_python, MySQL.

    解决方案

    So far I have found no "nice" solution for this. I have some more strict soft realtime requirements (taking a picture from a cardboard box being labeled) so probably one of the approaches is fast enough for you. I assume emails can wait for a few minutes.

    A "todo list" in the database processed by a cron job.

    A "todo list" in the database processed permanently beeing polled by a daemon.

    Using a custom daemon which gets notified by the webserver via an UDP packet (in Production today). Basically my own Queing system with the IP stack for handling the queue.

    Using ActiveMQ as a message broker - this didn't work out because of stability issues. Also to me Java Daemons are generally somewhat plump

    Using Update Triggers in CouchDB. Nice but Update Triggers are not meant to do heavy image processing, so no good fit for my problem.

    So far I haven't tried RabbitMQ and XMPP/ejabebrd for handling the problem but they are on my list of next things to try. RabbitMQ got decent Python connectivity during 2008 and there are tons of XMPP libraries.

    But perhaps all you need is a correctly configured mailserver on the local machine. This probably would allow you to dump mails synchronously into the local mailserver and thus make your whole software stack much more simple.

    展开全文
  • Django任务队列-源码

    2021-02-13 06:23:03
    mython django的简单任务队列
  • django分页和消息队列

    千次阅读 2017-04-23 01:04:28
    django分页和消息队列


    起源于一个神奇的项目,内容就是爬取搜索引擎的搜索重新建立一个搜索入口.然后就碰到了一些问题:
    1. 一次性爬取所有页面的话爬取速度是一个问题,能不能爬一页的内容先展示出来,后台继续爬取第二页及以后的页面,在继续展示?
    2. 爬取的结果展示出来是需要进行分页的,如何分页?

    这里首先讲解一下如何分页

    Paginator

    在django中分页采用的是Paginator,举个例子

    from django.core.paginator import Paginator
    from django.core.paginator import EmptyPage
    from django.core.paginator import PageNotAnInteger
    from hello.models import Topic
    
    
    def index(request):
        limit = 3  # 每页显示的记录数
        topics = Topic.objects.all()
        paginator = Paginator(topics, limit)  # 实例化一个分页对象
    
        page = request.GET.get('page')  # 获取页码
        try:
            topics = paginator.page(page)  # 获取某页对应的记录
        except PageNotAnInteger:  # 如果页码不是个整数
            topics = paginator.page(1)  # 取第一页的记录
        except EmptyPage:  # 如果页码太大,没有相应的记录
            topics = paginator.page(paginator.num_pages)  # 取最后一页的记录
    
        return render_to_response('index.html', {'topics': topics})

    然后在模板里面的稍作修改即可

    {% for topic in topics.object_list %}
      <p>{{ topic.title }}</p>
    {% endfor %}
    
    <!-- 第一种分页显示方式 -->
    <p>
      {# topics.paginator.page_range 这个函数返回包含一个所有页码数的 range 对象 #}
      {# 即 range(1, topics.paginator.num_pages + 1) #}
      {% for page_number in topics.paginator.page_range %}
        {% ifequal page_number  topics.number %}
          {{ page_number }}
        {% else %}
          <a href="?page={{ page_number }}">{{ page_number }}</a>
        {% endifequal %}
      {% endfor %}
    </p>
    
    
    <!-- 另一种分页显示方式 -->
    <p>
    {% if topics.has_previous %}
      <a href="?page={{ topics.previous_page_number }}">Previous</a>
      {% endif %}
      {# topics.paginator.number_pages 返回总页数 #}
      Page {{ topics.number }} of {{ topics.paginator.num_pages }}.
    {% if topics.has_next %}
      <a href="?page={{ topics.next_page_number }}">Next</a>
    {% endif %}
    </p>

    但是在这里的解决方案不太适用,当前的结果并不是存在数据库里面的,而是实时查询爬取解析得来的,那么,这种分页方案似乎是不太适用,没办法,最后采取的方式是爬取特定或全部的页面,存入数据库,然后进一步的分页展示.这里就到了第一个问题:能否后台运行爬取任务,翻页时减少等待.
    这里就需要用到celery,注意的一点是以前的版本需要一个单独的django-celery保障django和celery的联合使用,现在不需要了,一个celery库即可.

    Celery

    按照官方教程配置,建议不懂celery的,先看一下这个,如果出现server问题,解决方案一般是需要安装对应的server,如redis等. 另外重要的一点为了能够使用后台运行的结果,按照教程中需要安装django-celery-results,同时在后台task函数里面,将结果保存在django_celery_results.models.TaskResult里面,

    from __future__ import absolute_import, unicode_literals
    from django-celery-results import models
    from celery import shared_task
    @shared_task
    def func(x, y):
        result = somefunction(x+y)
        id = anotherfunction(x+y)
        django_result = models.TaskResult(task_id = id,result=result)
        django_result.save()
        return id

    在后台运行的结果就可以task_id重新查询到,当然在这里如果考虑到实时和数据库容量的问题,则需要定时或者在sseion结束时删除掉对应task_id的运行结果,这里同样需要用celery制定一个定时任务
    Tips:
    1. 在运行celery -A proj worker –loglevel=info出现问题”server channel error 406, message: PRECONDITION_FAILED”的一个原因可能是你在另外一个地方运行了同样的celery 任务,这里需要的就是关掉其他运行的celery任务,就没有问题了.
    2. 查看文档比查看博客来的准确,查github作为具体项目的借鉴.

    参考文献

    1. https://mozillazg.github.io/2013/01/django-pagination-by-use-paginator.html
    2. 文中链接引用
    展开全文
  • 多任务队列demo 安装对应的库 pip3 install celery==4.4.2 pip3 install eventlet==0.25.2 pip3 install Django==2.0.4 配置settings文件 这里broker配置redis,同时backend也就是任务结果也存到redis中,...

    多任务队列demo

    在这里插入图片描述

    1. 安装对应的库

    pip3 install celery==4.4.2
    pip3 install eventlet==0.25.2
    pip3 install Django==2.0.4
    
    1. 配置settings文件

      这里broker配置redis,同时backend也就是任务结果也存到redis中,格式为json,方便读写。

      # 定义上传文件夹的路径
      UPLOAD_ROOT = os.path.join(BASE_DIR, 'static/upload')
      
      CELERY_BROKER_URL = 'redis://localhost:6379/'
      
      CELERY_RESULT_BACKEND = 'redis://localhost:6379/'
      
      CELERY_RESULT_SERIALIZER = 'json'
      
    2. 创建与settings同级目录的celery.py

      mydjango为当前项目名称

      from __future__ import absolute_import, unicode_literals
      import os
      from celery import Celery
      
      # 设置环境变量
      os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'mydjango.settings')
      
      # 注册Celery的APP
      app = Celery('mydjango')
      # 绑定配置文件
      app.config_from_object('django.conf:settings', namespace='CELERY')
      
      # 自动发现各个app下的tasks.py文件
      app.autodiscover_tasks()
      
    3. 修改settings.py 同级目录下的init.py文件

      from __future__ import absolute_import, unicode_literals
      from .celery import app as celery_app
      
      #导包
      import pymysql
      #初始化
      pymysql.install_as_MySQLdb()
      
      
      
      __all__ = ['celery_app']
      
    4. 在应用中创建tasks.py文件

      from celery.task import task
      
      # 自定义要执行的task任务
      @task
      def print_test():
      	print("nict try")
      	return 'hello'
      
    5. 通过django视图调用异步请求

      from myapp import tasks
      
      def ctest(request,*args,**kwargs):
          res=tasks.print_test.delay()
          #任务逻辑
          return JsonResponse({'status':'successful','task_id':res.task_id})
      
    6. 启动celery服务 在manage.py同级目录下运行

      celery worker -A mydjango -l info -P eventlet
      

      如果请求是post方式 需要用此命令来启动服务

      celery worker -A mydjango -l info  --pool=solo
      
    7. 定时任务

      settings.py文件中

      from datetime import timedelta
      
      CELERY_BEAT_SCHEDULE = {
          # 定义定时任务
          'celery_work': {
              'task': "myapp.tasks.async_test",
              'schedule': timedelta(hours=2)
          }
      }
      

      如果需要启动定时任务,就需要在manage.py所在的文件夹内单独启动beat服务

      celery -A mydjango beat -l info
      
    展开全文
  • 最近刚好需要使用到消息队列,与rabbitmq比较之后,...所以,我这里使用Django的xadmin进行了改造,来作为redis一个简单的消息队列可视化管理。效果如下图:     由于默认的xadmin功能是对数据库里的数据进...

        最近刚好需要使用到消息队列,与rabbitmq比较之后,发现redis更容易上手。虽然比起redis,rabbitmq对消息队列的功能支持更强大;而且redis不比rabbitmq——默认自带消息队列的管理后台。所以,我这里使用Django的xadmin进行了改造,来作为redis一个简单的消息队列可视化管理。效果如下图: 

     

       由于默认的xadmin功能是对数据库里的数据进行显示,所以这里需要进行一些自定义修改。xadmin一般默认是MySQL进行对接,将表里的数据在页面上显示出来。所以我原本的思路是,修改对models的查询结果,将xadmin从mysql查询的数据改到从redis查询。但通过查看源码发现,xadmin的前端显示与后端返回的queryset对象进行了绑定,通过遍历queryset对象的属性来获取查询数据的,很难找到在中间修改数据源的位置。所以这里是直接重写了部分前端代码。

       为了支持功能的扩展,这里的消息获取使用drf的APIView接口:

    class MsgQueueAPI(APIView):
        def post(self, request):
            conn = redis.StrictRedis()
            res = conn.zrange("task", 0, -1)
            return HttpResponse('{"status":"success","res":' + json.dumps(res, ensure_ascii=False) + '}',
                                content_type="application/json")

       这里从redis的有序集合中获取所有的消息,以json的形式返回到前端。为了将消息整合到xadmin中显示,需要新增一个models:

    class Queue(models.Model):
        msg = models.CharField(max_length=10, verbose_name=u"队列消息", default=u"", null=True, blank=True)
    
        class Meta:
            db_table = "msg_queue"
            verbose_name = u"消息"
            verbose_name_plural = verbose_name
    
        def __unicode__(self):
            return u"消息"

       这里的models只有一个字段,但由于后面对前端的显示进行了自定义改造,所以这里的字段、包括数据库里的数据没有什么意义,只是为了xadmin上的显示。接下来,要对关联models的adminx进行一些特殊处理:

    class QueueAdmin(object):
        msg = True
        list_display = ['msg']
        search_fields = []
        list_filter = []
        list_export = ()
        list_exclude = ['id']
    
        def save_models(self):
            msg = self.new_obj.msg
            conn = redis.StrictRedis()
            conn.zadd("task", time.time(), msg)
    
    
    xadmin.site.register(Queue, QueueAdmin)
    xadmin.site.register_plugin(MsgQueuePlugin, ListAdminView)

       先说说从list_display向下的一些属性,是为了移除一些管理界面上用不到的功能,如过滤器、搜索框、导出数据功能等;这里要注意的是save_models方法,它重写了原来向MySQL数据的功能,通过new_obj先获取到增加数据界面提交的内容,但是不往MySQL里保存,而是向redis的队列里插入消息内容。通过save_models方法的特性,执行完该方法后,会自动跳转到列表显示页面。接下来要做的,就是在列表显示页面加载时调用上面写的MsgQueueAPI读取消息。

       新建一个msgQueue.js文件,并在加载时向MsgQueueAPI接口发送ajax请求。然后通过xadmin的自定义插件来加载js文件:

    class MsgQueuePlugin(BaseAdminPlugin):
        msg = False
    
        def init_request(self, *args, **kwargs):
            return bool(self.msg)
    
        def get_media(self, media):
            media.add_js([self.static('js/jquery.min.js'),
                          self.static('js/ajaxSetup.js'),
                          self.static('js/jquery.cookie.js'),
                          self.static('js/sendAjax.js'),
                          self.static('js/msgQueue.js')
                          ])
            return media

       这里已经在第三个代码片段通过xadmin.site.register_plugin的方式加载了该插件,并在QueueAdmin中配置msg为True使插件生效。在MsgQueuePlugin插件中可以看到,重写了get_media方法并加载了我们刚刚创建的msgQueue.js文件。

        最后记得,js获取到请求数据后,通过jquery修改xadmin原有页面的部分html结构,将消息显示出来。这里只是做了简单的消息展示。通过前端的js,其实我们还可以做更多的事情,比如消息的删除,指定需要发布到哪个消息队列等。

    展开全文
  • 本节主要实现 django消息队列Celery的基本配置,并进行操作演示
  • 我的django专栏029阶段Celery消息队列的配置和实现的源码
  • django 信号机制signals 消息队列celery

    千次阅读 2017-04-03 17:29:50
    许多人会将django signal和异步消息列队(例如celery)搞混. signal是同步处理, 因此通过signal调用大处理量的进程时并无法提高性能. 事实上, 将这些需要大处理量的进程移到signal中被视作是一种不好的习惯. 以下...
  • Python消息队列django+celery+kombu

    千次阅读 2016-12-29 20:32:44
    django1.10 python3.5 安装文件: kombu-3.0.37.tar.gz celery-3.1.25 billiard-3.3.0.23 按照python库的安装方式安装即可 配置 配置一个django项目如prj,app为app 不熟悉的话请参照 celery配置 1 在 prj/...
  • Django的事件队列应用程序。 特征: 监视模型:可以注册模型以在创建/更新/删除操作时自动生成事件 处理日志:日志将作为事件保存在数据库中或导出 导出事件:将事件保存到Postgresql,Influxdb,Redis或通过...
  • django+celery实现异步消息队列

    千次阅读 2018-05-16 16:50:14
    创建项目 django-admin startproject project2. 创建apppython manage.py startapp sendemail3. 配置settings.pyDEBUG = FalseALLOWED_HOSTS = ['127.0.0.1']# celerydjcelery.setup_loader()BROKER_URL = 'redis:/...
  • 为提高网站性能,很多耗时,但不影响页面正常的操作,可丢给消息队列异步执行 “”“ 比如SNS网站的“新鲜事儿”系统,我发帖之后,会给所有关注我的人推送一条通知。乍一看没什么难的,发帖之后找出关注我的人...
  • 本文是作者在接触django框架后使用...2、将API结果存入消息队列,以便在消息处理过程中添加人工修改消息处理结果的接口 3、Django异步处理框架(步骤2中的消息处理过程由代码执行-人工智能) 工具包版本: django-cel
  • Django异步任务队列

    2020-09-04 19:38:33
    https://www.cnblogs.com/pengsq/p/10099386.html
  • 使用rabbitmq和celery在django中实现dockerized示例pub / sub类型消息队列的示例。 有关中型故事的详细解释,请参见: 发布/订阅角色定义 发布者:声明了一个单独的RabbitMQ队列生成器,并将其添加到Celery的默认...
  • 消息队列的应用和celery异步化操作 Django中的中间件用更准确的方法应该称为拦截过滤器。消息队列能够解决消息传递的问题,分为两种模式:点到点传递、发布订阅。对于网站的优化的两大定律,第一定律就是使用缓存,...
  • 主要介绍了Django Celery异步任务队列的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
  • 消息队列配置文档:使用 MongoDB数据库:1. 安装 MongoDB.2. easy_install pymongo3. easy_install celery4. easy_install django celery5. settings.py 配置增加 app INSTALLED_APPS = ('djcelery','tasks',)# Using...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 9,632
精华内容 3,852
关键字:

django消息队列