非同步任務利器Celery(二)在django項目中使用Celery

来源:http://www.cnblogs.com/linxiyue/archive/2017/09/14/7518535.html
-Advertisement-
Play Games

Celery 4.0支持django1.8及以上的版本,低於1.8的項目使用Celery 3.1。 一個django項目的組織如下: 首先建立proj/proj/celery.py文件: 然後要保證django項目啟動時上述的app被載入,修改proj/proj/__init__.py文件: 現在就 ...


Celery 4.0支持django1.8及以上的版本,低於1.8的項目使用Celery 3.1。

一個django項目的組織如下:

- proj/
  - manage.py
  - proj/
    - __init__.py
    - settings.py
    - urls.py

首先建立proj/proj/celery.py文件:

from __future__ import absolute_import, unicode_literals
import os
from celery import Celery

# set the default Django settings module for the 'celery' program.
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'proj.settings')

app = Celery('proj')

# Using a string here means the worker doesn't have to serialize
# the configuration object to child processes.
# - namespace='CELERY' means all celery-related configuration keys
#   should have a `CELERY_` prefix.
app.config_from_object('django.conf:settings', namespace='CELERY')

# Load task modules from all registered Django app configs.
app.autodiscover_tasks()


@app.task(bind=True)
def debug_task(self):
    print('Request: {0!r}'.format(self.request))

然後要保證django項目啟動時上述的app被載入,修改proj/proj/__init__.py文件:

from __future__ import absolute_import, unicode_literals

# This will make sure the app is always imported when
# Django starts so that shared_task will use this app.
from .celery import app as celery_app

__all__ = ['celery_app']

現在就可以在INSTALLED_APPS中的app下建立tasks.py文件啦:

- app1/
    - tasks.py
    - models.py
- app2/
    - tasks.py
    - models.py

比如:

# Create your tasks here
from __future__ import absolute_import, unicode_literals
from celery import shared_task


@shared_task
def add(x, y):
    return x + y


@shared_task
def mul(x, y):
    return x * y


@shared_task
def xsum(numbers):
    return sum(numbers)

在views中調用這些tasks即可非同步運行。

如果使用Redis作為broker,在settings.py中添加:

CELERY_BROKER_URL = 'redis://localhost:6379/0'

可以使用Django ORM/Cache作為儲存backend。

下載庫:

$ pip install django-celery-results

設定settings.py:

INSTALLED_APPS = (
    ...,
    'django_celery_results',
)

建立數據表:

$ python manage.py migrate django_celery_results

在settings.py中添加Celery設置:

CELERY_RESULT_BACKEND = 'django-db'
CELERY_RESULT_BACKEND = 'django-cache'

啟動:

$ celery -A proj worker -l info

可以在python manage.py shell中調用:

$ python manage.py shell
Python 2.7.12 (default, Nov 19 2016, 06:48:10) 
[GCC 5.4.0 20160609] on linux2
Type "help", "copyright", "credits" or "license" for more information.
(InteractiveConsole)
>>> from app1.tasks import add
>>> add.delay(3,4)
<AsyncResult: a9abab6d-b7a9-47e6-8c09-ec284948449f>

celery日誌:

[2017-09-14 00:09:41,432: INFO/ForkPoolWorker-1] Task urldata.tasks.add[38af760e-ed6c-48f8-b77c-d67bade8d6b8] succeeded in 0.00782653002534s: 7

官方一個完整的例子:https://github.com/celery/celery/tree/master/examples/django/

官方文檔還有一個非同步審查用戶上傳評論的例子。

blog/models.py:

from django.db import models
from django.utils.translation import ugettext_lazy as _


class Comment(models.Model):
    name = models.CharField(_('name'), max_length=64)
    email_address = models.EmailField(_('email address'))
    homepage = models.URLField(_('home page'),
                               blank=True, verify_exists=False)
    comment = models.TextField(_('comment'))
    pub_date = models.DateTimeField(_('Published date'),
                                    editable=False, auto_add_now=True)
    is_spam = models.BooleanField(_('spam?'),
                                  default=False, editable=False)

    class Meta:
        verbose_name = _('comment')
        verbose_name_plural = _('comments')

在views中先保存評論,同時調用celery非同步審核。

blog/views.py:

from django import forms
from django.http import HttpResponseRedirect
from django.template.context import RequestContext
from django.shortcuts import get_object_or_404, render_to_response

from blog import tasks
from blog.models import Comment


class CommentForm(forms.ModelForm):

    class Meta:
        model = Comment


def add_comment(request, slug, template_name='comments/create.html'):
    post = get_object_or_404(Entry, slug=slug)
    remote_addr = request.META.get('REMOTE_ADDR')

    if request.method == 'post':
        form = CommentForm(request.POST, request.FILES)
        if form.is_valid():
            comment = form.save()
            # Check spam asynchronously.
            tasks.spam_filter.delay(comment_id=comment.id,
                                    remote_addr=remote_addr)
            return HttpResponseRedirect(post.get_absolute_url())
    else:
        form = CommentForm()

    context = RequestContext(request, {'form': form})
    return render_to_response(template_name, context_instance=context)

tasks如下:

blog/tasks.py

from celery import Celery

from akismet import Akismet

from django.core.exceptions import ImproperlyConfigured
from django.contrib.sites.models import Site

from blog.models import Comment


app = Celery(broker='amqp://')


@app.task
def spam_filter(comment_id, remote_addr=None):
    logger = spam_filter.get_logger()
    logger.info('Running spam filter for comment %s', comment_id)

    comment = Comment.objects.get(pk=comment_id)
    current_domain = Site.objects.get_current().domain
    akismet = Akismet(settings.AKISMET_KEY, 'http://{0}'.format(domain))
    if not akismet.verify_key():
        raise ImproperlyConfigured('Invalid AKISMET_KEY')


    is_spam = akismet.comment_check(user_ip=remote_addr,
                        comment_content=comment.comment,
                        comment_author=comment.name,
                        comment_author_email=comment.email_address)
    if is_spam:
        comment.is_spam = True
        comment.save()

    return is_spam

  

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • (1)普通文件(regular file):這是最常用的文件類型,這種文件包含了某種形式的數據,文件內容的解釋由處理該文件的應用程式進行。 (2)目錄文件(directory file):這種文件包含了其他文件的 名字以及指向這些文件有關信息的指針。對一個目錄文件具有讀許可權的進程,都可以讀該目錄的內 ...
  • 第二天,繼續學習Linux命令。。。 一、查看文件和目錄列表的命令 ls:顯示當前目錄下的文件和目錄,但是不會顯示隱藏的文件和目錄。 ls -a:顯示當前目錄下的所有文件和目錄。 ls -l:顯示當前目錄下的文件和目錄的一些詳細信息,其中包括: 文件類型:比如目錄(d)、文件(-)、字元型文件(c) ...
  • 關鍵字:StructLayout、LayoutKind.Explicit、FieldOffset 輸出的值: 欄位定義交換順序: 同樣的偏移量,輸出的值以最後一個欄位的值為準。 CLR保持開發人員的定義欄位的順序。 ...
  • 系統環境 操作系統:CentOS6.9關閉防火牆 安裝步驟 1. 安裝Postfix 2. 下載rpm包並安裝 3. 配置gitlab,vim /etc/gitlab/gitlab.rb,指定ip+埠號 4. 執行配置並啟動。--gitlab-ctl reconfigure--gitlab-ctl ...
  • 1.新建項目選擇ASP.net MVC 4 Web應用程式 2.選擇Web API c 3.在新建立的項目裡面有已經生成的webapi模版 其中App_Start文件夾下WebApiConfig.cs和RouteConfig.cs文件主要配置api的路由信息。 Controllers文件夾下的文件為 ...
  • 1. 前言 最近在自定義Expander的樣式,順便看了看它的源碼。 Expander控制項是一個ContentControl,它通過IsExpanded屬性或者通過點擊Header中的ToggleButton控制內容展開或隱藏。UWP SDK中沒提供這個控制項,而是在UWP Community Too ...
  • private void UnsetReadOnly(string dirPath) {//http://bbs.csdn.net/topics/380233913 string[] dirPathes = Directory.GetDirectories(dirPath, "*.*", Searc ...
  • sh是一個比subprocess好的庫,能夠執行shell命令 1.查看ip: [root@iZj6cbstl2n6r280a27eppZ myblog]# ifconfigeth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500 inet ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...