djangoページングとメッセージキュー

5192 ワード

不思議なプロジェクトに起源があり、内容は検索エンジンの検索を登って検索入口を再構築することである.それからいくつかの問題に遭遇しました:1.一度にすべてのページを這い出すと這い出す速度が問題になりますが、1ページの内容を先に展示して、バックグラウンドで2ページ目以降のページを這い出して、展示を続けてもいいですか?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 %}
  

{{ topic.title }}

{% endfor %}

{# 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 %} "?page={{ page_number }}">{{ page_number }} {% endifequal %} {% endfor %}

{% if topics.has_previous %} "?page={{ topics.previous_page_number }}">Previous {% endif %} {# topics.paginator.number_pages #} Page {{ topics.number }} of {{ topics.paginator.num_pages }}. {% if topics.has_next %} "?page={{ topics.next_page_number }}">Next {% endif %}


しかし、ここでの解決策はあまり適用されず、現在の結果はデータベース内に存在するのではなく、リアルタイムで検索して解析したものである.ここで最初の問題は、バックグラウンドでロールアップタスクを実行できるかどうか、ページをめくるときの待ち時間を減らすことです.ここでceleryを用いる必要があるが、以前のバージョンではdjango-celeryがdjangoとceleryの共同使用を保障するために単独のdjango-celeryが必要であったことに注意し、現在は不要であり、1つのceleryライブラリでよい.
Celery
公式チュートリアルの構成によると、celeryが分からないことをお勧めします.まずこれを見てみましょう.serverの問題が発生した場合、解決策はredisなどの対応するserverをインストールする必要があります.また重要なのは、バックグラウンドで実行できる結果を使用するために、チュートリアルに従って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」の1つの原因は、同じceleryタスクを別の場所で実行した可能性があります.ここで必要なのは、他のceleryタスクをオフにすることです.問題ありません.2.ドキュメントの表示はブログの表示より正確で、githubを具体的なプロジェクトの参考とする.
参考文献
  • https://mozillazg.github.io/2013/01/django-pagination-by-use-paginator.html
  • 文書中のリンク参照