каналы получают параметр URL без пробелов - PullRequest
0 голосов
/ 21 февраля 2020

Привет, я возился с django -каналами 2 и хочу получить параметр URL и использовать его в функции, но похоже, что он содержит пробел или что-то похожее, что вызывает проблемы с моей функцией. Моя функция принимает 1 аргумент, но когда я пытаюсь передать в нее параметр URL, выдается следующая ошибка task_status() takes 1 positional argument but 2 were given. Я вижу, когда я пытаюсь напечатать URL-адрес, он печатает правильное значение, но также создается новая строка.

Можно ли получить ТОЛЬКО параметр URL-адреса и использовать его непосредственно в функции?

consumers.py
class ChatConsumer(AsyncConsumer):
    async def websocket_connect(self, event):
        await self.send({
            "type": "websocket.accept"
        })

        user = self.scope['user']
        get_task_id = self.scope['url_route']['kwargs']['task_id']
        print(get_task_id)
        get_info = await self.task_status(get_task_id)
        print(get_info)
        await self.send({
            "type": "websocket.send",
            "text": "hey"
        })
    async def websocket_receive(self, event):
        print("receive", event)

    async def websocket_disconnect(self, event):
        print("disconnected", event)

    def task_status(task_id):
        command = "golemcli tasks show {}".format(task_id)
        taskoutput = subprocess.getoutput(command)
        print(taskoutput)

routing.py

from django.urls import re_path

from . import consumers

websocket_urlpatterns = [
    re_path(r'ws/dashboard/task/(?P<task_id>[0-9a-f-]+)', consumers.ChatConsumer),
]

URL веб-сайта http://localhost:8000/dashboard/task/aa3c6c12-5446-11ea-b237-1e0f691c9a55

1 Ответ

1 голос
/ 21 февраля 2020

Ваш task_status является методом, поэтому его первым дополнением должно быть self, python всегда добавляет это дополнение к функции при вызове, поэтому вы получаете ошибку. Он вызывает метод с self и с task_id

Чтобы исправить это, вы должны определить свой метод следующим образом:

def task_status(self, task_id):
    ....

в другой точке, которую вы ожидаете синхронно в вашем методе task_status это заблокирует весь сервер от обработки любого другого трафика c.

Вы должны сделать свой task_status метод async, а затем использовать asyn c команду подпроцесса для запуска и await для вывода https://docs.python.org/3/library/asyncio-subprocess.html#examples

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...