首页 > 解决方案 > Django 路径转换器引发 SynchronousOnlyOperation

问题描述

我正在将现有的 WSGI 服务器迁移到 ASGI,并且遇到了路径转换器中使用 ORM 引发 SynchronousOnlyOperation 异常的问题。

我的转换器代码是这样的

class ModelPkConverter:
    regex = r'\d+'
    model = MyModel

    def to_python(self, primary_key):
        try:
            return self.model.objects.get(pk=primary_key)
        except self.model.DoesNotExist:
            raise ValueError

    def to_url(self, instance):
        return f'{instance.pk}'

所以当我去一个像/myapp/<MyModel:my_model>/我一样的网址时

django.core.exceptions.SynchronousOnlyOperation:您不能从异步上下文中调用它 - 使用线程或 sync_to_async。

我到底应该放在sync_to_async哪里?如果我像这样在转换器中这样做

    @sync_to_async
    def to_python(self, primary_key):
        ...

转换器输出一个协程对象而不是 MyModel 实例,所以当我尝试使用它时会得到 AttributeError 。

AttributeError:“协程”对象没有属性“my_attribute”

我应该await在视图中看到它吗?这将破坏使用转换器的目的。我只能这样做get_object_or_404

是否有不涉及设置DJANGO_ALLOW_ASYNC_UNSAFE为 True 的解决方案?在这一点上,我正在考虑将所有东西从转换器中重构出来,并<int:mymodel_id>在任何地方使用。还有其他方法吗?

标签: djangopython-asynciodjango-ormasgi

解决方案


推荐阅读