iQIzBAEBCgAdFiEEgp5wx8+ggeLmQKiikpDftiGHlegFAlqTAm8ACgkQkpDftiGH
lejSlw//V7/BZWBvstQxx58FMAY4H1sJTlHpuPzMEW4odooETEWqB4azw/UFNKAb
O3OsGankxTxP5JjYwUvtRfCW7NRRChTcaW+XSqlcecxaeBB7KtDCbozRBpYnbKWr
uLSpeMp+Mswz8cQWhHPIAbWTRspKLNvr9iY1h3NUvRVAInTEV52a9YMvfy6Q+Q+3
9Cei1ppqYPEPHNF6opS5Fyi5hHouYsoQSW+5bObhdJpe37ij6mNnnXbwqedepcth
hRbvMD4RxR1/2xnJZM5kWrQNEMIgSDJWFxj4cCih6mooZM6P47ieIy2M0boIV+44
1bSiiy0+hkCZY0htLo4zgg1iKr76JmgC78AWO30LI85qBtp2kJOormWXgVIKOAGt
7Ih0rdpqye2WUms85nvQvxILBDN+kJYzXAk1QMNgpcAWSgEJhtcqjCrgbqLbnN/n
sN5gBovjUzLSYu1/TrDFbB2QCal1R9R/uRW2gAmqCYV6TYXlptE7VGlw4mwM6U0e
+PWlj9b3YR36H7+Kf0wXvk0jyBThCEyEuP40jP3/AUOl6M7HLJJfuivZ0J4heDFu
Si7IoFV7erZ6dFeNwQCj9q4+VuwmPtbHbYvZRkpfTxJN5viQ3EddIoW5Swo4QsJJ
z5b+mO0J5wkizvvov0DjBQShGtIuSAz1hqS39wOSOhz1TWE3jEY=
=f8mR
-----END PGP SIGNATURE-----
Of course!
It works now perfectly, thank you. Sorry I missed that in docs.
Cheers,
Tom
25. 2. 2018 v 19:12, Andrew Godwin <andrew@aeracode.org>:I think the change you need to make is swapping in database_sync_to_async rather than sync_to_async - see here: http://channels.readthedocs.io/en/latest/topics/databases.htmlAndrewOn Sun, Feb 25, 2018 at 7:14 AM, Tomáš Ehrlich <tomas.ehrlich@gmail.com> wrote:Here's the gist (https://gist.github.com/tricoder42/ ) with consumer.af3d0337c1b33d82c1b32d12bd0265 ec
Dne neděle 25. února 2018 15:37:19 UTC+1 Tomáš Ehrlich napsal(a):Hello,I've just migrated my project to django-channels 2.x. Thanks to everyone involved!I'm trying to write a test for a consumer.I have a post_save signal receiver, which sends a message to a group. As I understand,I need to wrap `group_send` with `async_to_sync` because django signals can't beasync functions:def notify_on_model_changes(model):
from django.contrib.contenttypes.models import ContentType
ct = ContentType.objects.get_for_model(model)
model_label = '.'.join([ct.app_label, ct.model])
channel_layer = get_channel_layer()group_send = async_to_sync(channel_layer.group_send)
def receiver(sender, instance, **kwargs):
payload = {
'type': 'model.changed',
'pk': instance.pk,
'model': model_label
}
group_send(f'django.{model_label}', payload)
post_save.connect(receiver, sender=model, weak=False,
dispatch_uid=f'django.{model_label}') # in AppConfig.ready:# notify_on_model_changes(Conversation) My test suite, however, is async function:@pytest.fixture
async def communicator():
communicator = WebsocketCommunicator(GraphqlSubcriptionConsumer, "/")
await communicator.connect()
yield communicator
await communicator.disconnect()
async def test_subscription_start(communicator):
def make_conversation():
return Conversation.objects.create()
# function body truncated# subscribe for changes in Conversation model
await communicator.send_json_to(data)
conversation = await sync_to_async(make_conversation)()
response = await communicator.receive_json_from()
assert response['type'] == 'data'I can't use `Conversation.objects.create()` directly, because it uses `async_to_sync`. First, I need to convert it to async and await the result. I kinda feel this is hackishjumping from async to sync and back to async, but so far everything works as expectedand test works.Here comes the punchline:The tests fail to teardown cleanly, because apparently there's hanging DB connectionand after a while pytest just fails with `There is 1 other session using the database.`.Breadcrumbs:1. If I comment out last three lines of test (make_conversations and waiting for result),the test exits cleanly - seems like there's no problem with passing `sync_to_async` functionto `post_save.connect`.2. If I create `async_make = sync_to_async(make_conversation)`, but don't call it at all, the test exists cleanly - I thought that there might be problem with calling `async_to_sync`inside code wrapped with `sync_to_async`.I suspect there's a hanging db connection which isn't cleaned and/or garbage collected.I would also appreciate any comments about structure of such tests - is there cleaner waytest django signals inside async test cases?Cheers,TomTo view this discussion on the web visit https://groups.google.com/d/--
You received this message because you are subscribed to the Google Groups "Django users" group.
To unsubscribe from this group and stop receiving emails from it, send an email to django-users+unsubscribe@googlegroups.com .
To post to this group, send email to django-users@googlegroups.com.
Visit this group at https://groups.google.com/group/django-users .msgid/django-users/af745c4f- .7571-40d3-b738-1593d4d75bbb% 40googlegroups.com --
You received this message because you are subscribed to a topic in the Google Groups "Django users" group.
To unsubscribe from this topic, visit https://groups.google.com/d/topic/django-users/HD-gijCEgqM/unsubscribe.
To unsubscribe from this group and all its topics, send an email to django-users+unsubscribe@googlegroups.com.
To post to this group, send email to django-users@googlegroups.com.
Visit this group at https://groups.google.com/group/django-users.
To view this discussion on the web visit https://groups.google.com/d/msgid/django-users/CAFwN1upHZSCzicBndZsqbSVZyA-erHmkfNnqUr-nNFAXBs9DjQ%40mail.gmail.com.
For more options, visit https://groups.google.com/d/optout.
No comments:
Post a Comment