Django:如何存储子域名
我需要创建一个基于子域的身份验证系统,如37信号,新书,代码库使用。 也就是说,我的主应用程序的每个子域需要有自己的用户名称空间。 我想尽可能地保留django认证系统。
什么是存储用户名的好方法?
特别是,只要其帐户属于不同的子域,不同的用户应该可以拥有相同的用户名。
我已经考虑了一些方法,为此我可以预见到一些缺点:
过去我已经为几个网站构建了这个功能,并且发现你的第一个要点是要走的路。
这意味着您不必对django auth进行大规模更改。 我所做的是建立了一个自定义身份验证后端,用于抽象存储用户名的方式。
auth_backends.py
from django.contrib.auth.backends import ModelBackend
from Home.models import Account
class CustomUserModelBackend(ModelBackend):
def authenticate(self, subdomain, email, password):
try:
user = Account.objects.get(username=u'%s.%s' % (subdomain, email))
if user.check_password(password):
return user
except Account.DoesNotExist:
return None
def get_user(self, user_id):
try:
return Account.objects.get(pk=user_id)
except Account.DoesNotExist:
return None
对于这个特定的项目Account
是用户模型,它只是直接从用户继承,但你可以用你想要的任何东西替换Account
。
您必须在设置文件中安装自定义身份验证后端:
AUTHENTICATION_BACKENDS = (
'auth_backends.CustomUserModelBackend',
'django.contrib.auth.backends.ModelBackend',
)
然后当你打电话进行authenticate
你需要传入子域名,电子邮件和密码。
您还可以添加一些其他帮助函数或模型方法,以帮助确保只显示用户的实际用户名,但这些都很简单。
我认为这可能是将django.contrib.sites与您提到的第二个项目符号结合使用的一个很好的用例。 你可以像这样创建一个CustomUser模型:
from django.contrib.sites.models import Site
class CustomUser(User):
"""User with app settings."""
sites = models.ManyToManyField(Site)
然后,您可以编写自定义身份验证后端,以检查用户是否可以使用提供的凭据登录到当前子域。 这使您可以拥有多个网站(子域名)的一个用户名,而无需破解内部身份验证应用或存储具有自定义前缀的多个用户名。
编辑 :您可以使用Site.objects.get_current()
获取当前网站,然后检查当前网站是否位于用户的网站中。
您可以在这里阅读关于网站框架的更多信息:http://docs.djangoproject.com/en/dev/ref/contrib/sites/
链接地址: http://www.djcxy.com/p/875.html