Just like the one they posted, but with a few minor changes:

 async def __call__(self, scope, receive, send):
and:
return await self.inner(
dict(scope, schema_name=schema_name, multitenant=True), receive, send
)


Also, check if AuthMiddleware is using the channels.auth.get_user()
function within the correct schema.
David Emanuel Sandoval <https://www.linkedin.com/in/david-emanuel-sandoval/>
WEB DEVELOPER
+549 3734 607102

<https://linkedin.com/in/david-emanuel-sandoval/>
<https://github.com/emasmach/>





El sáb, 27 ene 2024 a las 14:14, David Emanuel Sandoval (<
[email protected]>) escribió:

> To identify the tenant i used a middleware that extract the tenant from
> the domain.
>
> El sáb, 27 ene 2024, 10:28, Nagaraja <[email protected]> escribió:
>
>> Y cnt u use pusher instead of channels
>>
>> On Sat, 27 Jan, 2024, 4:40 pm 'Sebastián García' via Django users, <
>> [email protected]> wrote:
>>
>>> Hi, I'm reviving this old thread... do you know of any other solution to
>>> the one proposed by @Ahmed Ishtiaque
>>>
>>> Thanks
>>> El domingo, 24 de febrero de 2019 a la(s) 9:13:30 p.m. UTC-3, Ahmed
>>> Ishtiaque escribió:
>>>
>>>> @N Muchai,
>>>>
>>>> I don't know if you've found a workaround to this, but here's mine if
>>>> people are interested in the future.
>>>>
>>>> I just made a custom ASGI application that adds the tenant schema name
>>>> (provided your URLs are in the form *.domain.com, where * represents
>>>> the schema name) and whether the project is multitenant or not. I haven't
>>>> thought much about whether the boolean for multitenancy identifier helps,
>>>> so feel free to remove it in your implementation. I just stacked this
>>>> application in my project's `routing.py` file. Here's the code I have at
>>>> the moment:
>>>>
>>>> My Middleware:
>>>> class MTSchemaMiddleware:
>>>>     def __init__(self, inner):
>>>>         self.inner = inner
>>>>
>>>>     def __call__(self, scope):
>>>>         if "headers" not in scope:
>>>>             raise ValueError(
>>>>                 "MTSchemaMiddleware was passed a scope that did not
>>>> have a headers key "
>>>>                 + "(make sure it is only passed HTTP or WebSocket
>>>> connections)"
>>>>             )
>>>>
>>>>         for key, value in scope.get('headers', []):
>>>>             if key == b'host':
>>>>                 schema_name = value.decode('ascii').split('.')[0]
>>>>                 break
>>>>         else:
>>>>             raise ValueError(
>>>>                 "The headers key in the scope is invalid. "
>>>>                 + "(make sure it is passed valid HTTP or WebSocket
>>>> connections)"
>>>>             )
>>>>         return self.inner(
>>>>             dict(scope, schema_name=schema_name, multitenant=True)
>>>>         )
>>>>
>>>> My `routing.py`:
>>>>
>>>> import MTSchemaMiddleware # from wherever your Middleware class resides
>>>> application = ProtocolTypeRouter({
>>>> 'websocket': <your stack>(
>>>>             MTSchemaMiddleware(
>>>> URLRouter(
>>>> chat.routing.websocket_urlpatterns
>>>> )
>>>> )
>>>>             )
>>>> })
>>>>
>>>> After you do this, you will be able to access the `schema_name` and
>>>> `multitenant` variables inside your consumer's `scope` like this:
>>>> `schema_name = scope['schema_name']` or `multitenant =
>>>> scope[`multitenant`]`.
>>>>
>>>> Hope this helps someone!
>>>>
>>>> Best,
>>>> Ahmed
>>>>
>>>>
>>>>
>>>> On Thursday, January 10, 2019 at 7:22:40 AM UTC-5, N Muchai wrote:
>>>>>
>>>>> @Filbert,
>>>>>
>>>>> Am in the same exact spot using Django Channels with django-tenants. Did
>>>>> you find a way to identify the tenant?
>>>>>
>>>>> Thanks.
>>>>>
>>>>> On Tuesday, November 28, 2017 at 4:22:10 AM UTC+3, Filbert wrote:
>>>>>>
>>>>>> Sorry, yeah dig before I post :-|  Can create a class-based consumer
>>>>>> and use the message->headers->host. I'll get chest deep before ask 
>>>>>> another
>>>>>> question.
>>>>>>
>>>>>> On Monday, November 27, 2017 at 6:04:48 PM UTC-5, Andrew Godwin wrote:
>>>>>>>
>>>>>>> That would be correct (though please be aware Origin can be faked
>>>>>>> like host headers, so don't use it as the sole point of security).
>>>>>>>
>>>>>>> Is it not available via the headers list in the connect message?
>>>>>>>
>>>>>>> Andrew
>>>>>>>
>>>>>>> On Mon, Nov 27, 2017 at 2:58 PM, Filbert <[email protected]> wrote:
>>>>>>>
>>>>>>>> Thanks again. One last question, in order to "multi-tenant-ify"
>>>>>>>> Channels I think the challenge will be trickle the websocket "orgin" 
>>>>>>>> into
>>>>>>>> the consumer from Daphne somehow as it seems there is no way to know 
>>>>>>>> in a
>>>>>>>> consumer which tenant (unique domain) the message originated from. 
>>>>>>>> Without
>>>>>>>> the domain you can't establish the Postgres schema, without the schema 
>>>>>>>> you
>>>>>>>> have no tenant :-)
>>>>>>>>
>>>>>>>> Please confirm this would be the approach or whether I am
>>>>>>>> wrong-headed here.
>>>>>>>> Thanks.
>>>>>>>>
>>>>>>>> On Sunday, November 26, 2017 at 9:58:58 AM UTC-5, Andrew Godwin
>>>>>>>> wrote:
>>>>>>>>>
>>>>>>>>> I've never used attach-daemon so I can't help you there I'm
>>>>>>>>> afraid. As long as it does sensible process-management things it's 
>>>>>>>>> probably
>>>>>>>>> alright?
>>>>>>>>>
>>>>>>>>> Andrew
>>>>>>>>>
>>>>>>>>> On Sat, Nov 25, 2017 at 5:17 PM, Filbert <[email protected]> wrote:
>>>>>>>>>
>>>>>>>>>> Andrew,
>>>>>>>>>> Thanks for the response. Seeing that I am keeping uWSGI for the
>>>>>>>>>> non-websocket paths, any heartache with me starting daphne and the
>>>>>>>>>> consumers using uWSGI's attach-daemon? I do this with celery and it 
>>>>>>>>>> is a
>>>>>>>>>> convenient way to have everything for the App managed as a unit via a
>>>>>>>>>> single /etc/init (upstart) conf file.
>>>>>>>>>> Thanks.
>>>>>>>>>>
>>>>>>>>>> On Friday, November 24, 2017 at 7:10:29 PM UTC-5, Andrew Godwin
>>>>>>>>>> wrote:
>>>>>>>>>>>
>>>>>>>>>>> Your assumptions all seem correct. Also consider that the
>>>>>>>>>>> security model of WebSockets is... interesting, so securing a 
>>>>>>>>>>> multi-tenant
>>>>>>>>>>> setup is going to require a bit more work than you would merely 
>>>>>>>>>>> doing the
>>>>>>>>>>> same for HTTP requests.
>>>>>>>>>>>
>>>>>>>>>>> There are other non-Channels options around if you want to look
>>>>>>>>>>> into them, but I suspect they'll all have similar architectural 
>>>>>>>>>>> challenges.
>>>>>>>>>>>
>>>>>>>>>>> Andrew
>>>>>>>>>>>
>>>>>>>>>>> On Fri, Nov 24, 2017 at 3:09 PM, Filbert <[email protected]>
>>>>>>>>>>> wrote:
>>>>>>>>>>>
>>>>>>>>>>>> Running multi-tenant site using a fork of Django tenant schemas
>>>>>>>>>>>> with tens of web servers and thousands of tenants....
>>>>>>>>>>>>
>>>>>>>>>>>> Piloting a project to implement Channels for real-time
>>>>>>>>>>>> notifications, etc.
>>>>>>>>>>>>
>>>>>>>>>>>> I want to confirm these assumptions:
>>>>>>>>>>>>
>>>>>>>>>>>> 1. Channels really has no support for multi-tenant, I will have
>>>>>>>>>>>> to roll my own.
>>>>>>>>>>>> 2. Since uWSGI is serving us well and (at this point) I
>>>>>>>>>>>> wouldn't trust Daphne to serve HTTP, I've got split paths in NGinx 
>>>>>>>>>>>> for
>>>>>>>>>>>> uWSGI and ASGI.
>>>>>>>>>>>> 3. We are running RabbitMQ, so we have to cluster it and
>>>>>>>>>>>> implement channels using asgi_rabbitmq (Redis would just add yet 
>>>>>>>>>>>> another
>>>>>>>>>>>> moving part)
>>>>>>>>>>>> 4. Plan on significant additional resource requirements on the
>>>>>>>>>>>> web server and serious scaling challenges.
>>>>>>>>>>>>
>>>>>>>>>>>> Are their any other non-Channels options, or is it the really
>>>>>>>>>>>> the only game in town?
>>>>>>>>>>>>
>>>>>>>>>>>> Thanks.
>>>>>>>>>>>>
>>>>>>>>>>>>
>>>>>>>>>>>>
>>>>>>>>>>>> --
>>>>>>>>>>>> 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 [email protected].
>>>>>>>>>>>> To post to this group, send email to [email protected]
>>>>>>>>>>>> .
>>>>>>>>>>>> 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/aae2725b-d873-40fd-ae09-d1668ab9e727%40googlegroups.com
>>>>>>>>>>>> <https://groups.google.com/d/msgid/django-users/aae2725b-d873-40fd-ae09-d1668ab9e727%40googlegroups.com?utm_medium=email&utm_source=footer>
>>>>>>>>>>>> .
>>>>>>>>>>>> For more options, visit https://groups.google.com/d/optout.
>>>>>>>>>>>>
>>>>>>>>>>>
>>>>>>>>>>> --
>>>>>>>>>> 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 [email protected].
>>>>>>>>>> To post to this group, send email to [email protected].
>>>>>>>>>> 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/d4906dc8-040b-4ee0-b11d-a7cc918b9e5d%40googlegroups.com
>>>>>>>>>> <https://groups.google.com/d/msgid/django-users/d4906dc8-040b-4ee0-b11d-a7cc918b9e5d%40googlegroups.com?utm_medium=email&utm_source=footer>
>>>>>>>>>> .
>>>>>>>>>>
>>>>>>>>>> For more options, visit https://groups.google.com/d/optout.
>>>>>>>>>>
>>>>>>>>>
>>>>>>>>> --
>>>>>>>> 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 [email protected].
>>>>>>>> To post to this group, send email to [email protected].
>>>>>>>> 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/4d7c94f1-81ad-4949-a987-35f45b188c2f%40googlegroups.com
>>>>>>>> <https://groups.google.com/d/msgid/django-users/4d7c94f1-81ad-4949-a987-35f45b188c2f%40googlegroups.com?utm_medium=email&utm_source=footer>
>>>>>>>> .
>>>>>>>>
>>>>>>>> For more options, visit https://groups.google.com/d/optout.
>>>>>>>>
>>>>>>>
>>>>>>> --
>>> 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 [email protected].
>>> To view this discussion on the web visit
>>> https://groups.google.com/d/msgid/django-users/daa6bec0-905d-415e-a63f-7d9b6efd8fa4n%40googlegroups.com
>>> <https://groups.google.com/d/msgid/django-users/daa6bec0-905d-415e-a63f-7d9b6efd8fa4n%40googlegroups.com?utm_medium=email&utm_source=footer>
>>> .
>>>
>> --
>> 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 [email protected].
>> To view this discussion on the web visit
>> https://groups.google.com/d/msgid/django-users/CAN1LePgGs%2BqAucxJvtpY6M%2BAZoWu6rzk9SSHYrdW_sWSJZWAsg%40mail.gmail.com
>> <https://groups.google.com/d/msgid/django-users/CAN1LePgGs%2BqAucxJvtpY6M%2BAZoWu6rzk9SSHYrdW_sWSJZWAsg%40mail.gmail.com?utm_medium=email&utm_source=footer>
>> .
>>
>

-- 
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 [email protected].
To view this discussion on the web visit 
https://groups.google.com/d/msgid/django-users/CAHUWMCa8wttAfs0XrSvGDX-jYuuDE4u3_Hht5Bkw6ALj5Gx-RQ%40mail.gmail.com.

Reply via email to