Saman Hamidi
Saman Hamidi

Reputation: 358

Correct way to use async class based views in Django

I am trying to use the very new Django 3.1 Async view classes. Based on the limited documentation available, I have tried to create my own async def __call__() method. From the documents:

For a class-based view, this means making its __call__() method an async def (not its __init__() or as_view()).

Django 3.1 Development Documents

However, until now I have had no luck with writing an asynchronous class based view. I constantly get await exceptions, or asyncio.iscoroutinefunction returns False, which I assume should return true if the class is actually Asynchronous.

Since the documentation is lacking an example, could someone with more knowledge of async programming help me with an example of a class based asynchronous view?

Upvotes: 9

Views: 7329

Answers (2)

str4hex
str4hex

Reputation: 31

class Test(CreateView):
    template_name = 'index.html'
    form_class = TestForm
    view_is_async = True # on async

Upvotes: 1

Kuizame
Kuizame

Reputation: 178

Spend quite some time searching in the Django ticket system, blogposts (thx to Joren), etc. so you don't have to.

The best you can do is using the code from the blog:

class YourView(View):    
    @classonlymethod
    def as_view(cls, **initkwargs):
        view = super().as_view(**initkwargs)
        view._is_coroutine = asyncio.coroutines._is_coroutine
        return view

    async def get(self, *args, **kwargs):
        ...

But you also need to be aware there is no way you can use actual generics (no async ORM support, even TemplateView doesn't work) and build-in decorators for 3.1. You need to write your own stuff for things that Django normally does itself.

Upvotes: 7

Related Questions