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)

...但是头像也需要存放在正确的位置。 所以问题是双重的:

  1. 如何在正确的租户感知位置获取头像?
  2. 如何正确服务他们?

您可以尝试通过在文件字段中指定 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