質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.49%
Django

DjangoはPythonで書かれた、オープンソースウェブアプリケーションのフレームワークです。複雑なデータベースを扱うウェブサイトを開発する際に必要な労力を減らす為にデザインされました。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Q&A

0回答

724閲覧

Django backgroundシグナル下のrequest.postの役割について

red_red

総合スコア13

Django

DjangoはPythonで書かれた、オープンソースウェブアプリケーションのフレームワークです。複雑なデータベースを扱うウェブサイトを開発する際に必要な労力を減らす為にデザインされました。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

0グッド

0クリップ

投稿2020/03/04 12:36

編集2020/03/04 12:39

djangoでチャットアプリを作りたいと考えています。そこで参考になるコードを探していたところ気になるコードを見つけたので、質問させていただきます。
該当のdjangoプロジェクトのコード
このプロジェクトの中の/api/chat/task.pyと/api/chat/signals.pyに気になるコードがあります。以下の通りです。

urls.py

"""api URL Configuration The `urlpatterns` list routes URLs to views. For more information please see: https://docs.djangoproject.com/en/2.1/topics/http/urls/ Examples: Function views 1. Add an import: from my_app import views 2. Add a URL to urlpatterns: path('', views.home, name='home') Class-based views 1. Add an import: from other_app.views import Home 2. Add a URL to urlpatterns: path('', Home.as_view(), name='home') Including another URLconf 1. Import the include() function: from django.urls import include, path 2. Add a URL to urlpatterns: path('blog/', include('blog.urls')) """ from django.contrib import admin from django.urls import path, include, re_path urlpatterns = [ path('admin/', admin.site.urls), re_path(r'(?P<version>(v1|v2))/', include('api.chat.urls')) ]

/chat/url.py

from django.urls import path, include from rest_framework.routers import DefaultRouter from rest_framework_extensions.routers import NestedRouterMixin from rest_framework_simplejwt import views as jwt_views from api.chat import views class NestedDefaultRouter(NestedRouterMixin, DefaultRouter): pass router = NestedDefaultRouter() rooms_router = router.register('rooms', views.RoomViewSet) rooms_router.register( 'messages', views.MessageViewSet, base_name='room-messages', parents_query_lookups=['room'] ) urlpatterns = [ path('', include(router.urls)), path('users/', views.CreateUserView.as_view()), path('users/<int:pk>/', views.DetailUserView.as_view()), path('auth/login', jwt_views.TokenObtainPairView.as_view()), path('auth/refresh', jwt_views.TokenRefreshView.as_view()), ]

models.py

from django.contrib.auth.models import User from django.db import models class Room(models.Model): title = models.CharField(max_length=100, blank=True, default='') participants = models.ManyToManyField(User) def __str__(self): return self.title class Message(models.Model): created_at = models.DateTimeField(auto_now=True) sender = models.ForeignKey(User, on_delete=models.CASCADE) room = models.ForeignKey(Room, on_delete=models.CASCADE) content = models.TextField(blank=True) def __str__(self): return self.content

views.py

from django.contrib.auth.models import User from django.http import Http404 from rest_framework import generics, permissions, viewsets from rest_framework_extensions.mixins import NestedViewSetMixin from api.chat import models, serializers class CreateUserView(generics.CreateAPIView): permission_classes = (permissions.AllowAny, ) queryset = User.objects.all() serializer_class = serializers.UserSerializer class DetailUserView(generics.RetrieveUpdateDestroyAPIView): queryset = User.objects.all() serializer_class = serializers.UserSerializer def get_queryset(self): user = self.request.user return User.objects.filter(id=user.id) class RoomViewSet(NestedViewSetMixin, viewsets.ModelViewSet): queryset = models.Room.objects.all() serializer_class = serializers.RoomSerializer def get_queryset(self): user = self.request.user return user.room_set.all() class MessageViewSet(NestedViewSetMixin, viewsets.ModelViewSet): queryset = models.Message.objects.all() serializer_class = serializers.MessageSerializer def get_queryset(self): parents_query_dict = self.get_parents_query_dict() room_id = parents_query_dict.get('room') user = self.request.user if not user.room_set.filter(id=room_id): raise Http404 queryset = super().get_queryset() query = self.request.GET.get('q') if query and self.action == 'list': queryset = queryset.filter(content__icontains=query) return queryset

task.py

from datetime import timedelta import requests from background_task import background from django.utils import timezone from api.chat.models import Message @background def push(to, content): data = { 'device_id': to, 'content': content, } try: requests.post('localhost:7000', json=data) except requests.exceptions.InvalidSchema: pass @background def msg_remover(lifetime): deadline = timezone.now() - timedelta(seconds=lifetime) Message.objects.filter(created_at__lt=deadline).delete()

signals.py

from django.conf import settings from django.db.models.signals import post_save, post_migrate from django.dispatch import receiver from django.utils import timezone from api.chat.models import Message from api.chat.tasks import push, msg_remover @receiver(post_save, sender=Message) def push_notification(sender, instance, **kwargs): msg = instance rest = msg.room.participants.exclude(id=msg.sender.id).all() for person in rest: push(to=person.id, content=msg.content) @receiver(post_migrate) def start_tasks(sender, **kwargs): lifetime = settings.MSG_LIFETIME msg_remover( lifetime, repeat=lifetime / 10, schedule=dict( run_at=timezone.now(), action=1, ), )

task.pyのpushでは、一体何を行っているのでしょうか。
signals.pyのpush_notificationからの流れで考えると、Messageインスタンスが保存されると、メッセージを送った人以外のチャットルームにいる人をdevice_idに格納してlocalhostにPOSTリクエストを送っているように思われます。
しかし、localhostにPOSTリクエストを送った後、一体どのような処理が行われるのでしょうか。
ご教示お願いいたします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.49%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問