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.