我正在将现有的 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>
在任何地方使用。还有其他方法吗?