django-tenant-schemas 和化身
django-tenant-schemas & avatars
多租户 django 1.8 设置(使用 django-tenants 模式)
requirements.txt:
Django==1.8.16
django-allauth==0.27.0
django-tenant-schemas==1.6.4
django-avatar==3.1.0
...
尽可能让租户保持隔离,所以只共享这些APP(注意这里没有allauth,每个租户都有自己的auth_user table):
SHARED_APPS = (
'tenant_schemas', # mandatory
'customers',
'django.contrib.contenttypes',
)
服务头像(来自 /media URL)现在是一个问题,因为头像 URL 不知道租户。
头像由
提供
/media/avatars/<user ID>/userx-pic.jpg
但为避免冲突,应将租户考虑在内。目标是:
/media/avatars/<tenant>/<user ID>/userx-pic.jpg
如何配置?
我正在考虑使用 RedirectView (https://docs.djangoproject.com/en/1.10/ref/class-based-views/base/#redirectview)
...但是头像也需要存放在正确的位置。
所以问题是双重的:
- 如何在正确的租户感知位置获取头像?
- 如何正确服务他们?
您可以尝试通过在文件字段中指定 upload_to 将媒体文件保存到特定的租户文件夹,并照常提供。例如:
from django.contrib.auth.models import User
from django.db import connection
def get_tenant_specific_upload_folder(instance, filename):
upload_folder = 'avatars/{0}/{1}/{2}'.format(
connection.tenant,
instance.user.pk,
filename
)
return upload_folder
class Avatar(models.Model):
user = models.ForeignKey(User)
file = models.FileField(upload_to=get_tenant_specific_upload_folder)
p.s。限制头像访问仅供所有者查看 this article
多租户 django 1.8 设置(使用 django-tenants 模式)
requirements.txt:
Django==1.8.16
django-allauth==0.27.0
django-tenant-schemas==1.6.4
django-avatar==3.1.0
...
尽可能让租户保持隔离,所以只共享这些APP(注意这里没有allauth,每个租户都有自己的auth_user table):
SHARED_APPS = (
'tenant_schemas', # mandatory
'customers',
'django.contrib.contenttypes',
)
服务头像(来自 /media URL)现在是一个问题,因为头像 URL 不知道租户。 头像由
提供/media/avatars/<user ID>/userx-pic.jpg
但为避免冲突,应将租户考虑在内。目标是:
/media/avatars/<tenant>/<user ID>/userx-pic.jpg
如何配置? 我正在考虑使用 RedirectView (https://docs.djangoproject.com/en/1.10/ref/class-based-views/base/#redirectview)
...但是头像也需要存放在正确的位置。 所以问题是双重的:
- 如何在正确的租户感知位置获取头像?
- 如何正确服务他们?
您可以尝试通过在文件字段中指定 upload_to 将媒体文件保存到特定的租户文件夹,并照常提供。例如:
from django.contrib.auth.models import User
from django.db import connection
def get_tenant_specific_upload_folder(instance, filename):
upload_folder = 'avatars/{0}/{1}/{2}'.format(
connection.tenant,
instance.user.pk,
filename
)
return upload_folder
class Avatar(models.Model):
user = models.ForeignKey(User)
file = models.FileField(upload_to=get_tenant_specific_upload_folder)
p.s。限制头像访问仅供所有者查看 this article