我在 Django-Tastypie 中使用自定义身份验证,它在身份验证成功时返回用户名和密码。在 ModelResource 实例中,一旦认证成功,用户名和密码就可用:
class TestResource(ModelResource):
class Meta:
queryset = Test.remote_supported.get_all(username,password)
resource_name = 'test'
filtering = {
'id' : ALL,
}
detail_allowed_methods = ['get', 'post', 'patch']
authorization = Authorization()
authentication = MyCustomAuth()
always_return_data = True
def __init__(self, api_name=None):
self.username = None
self.password = None
super(TestResource, self).__init__(api_name)
def is_authenticated(self, request):
auth_result = self._meta.authentication.is_authenticated(request)
if isinstance(auth_result, HttpResponse):
raise ImmediateHttpResponse(response=auth_result)
if not auth_result is True:
raise ImmediateHttpResponse(response=http.HttpUnauthorized())
# this is where I receive the username and password from my custom auth
self.username, self.password = self._meta.authentication.get_credentials()
这段代码显然不起作用,因为那个用户名和那个密码在元类中不可用,即使是,改变它也不会只影响这个实例,而是所有实例,这不是我的意图,因为用户名的范围和密码应该是每个 RESTful 查询。
这是我的模型的样子:
class RemoteAuthSupported(models.Manager):
def get_all(self, username, password):
# ... here I do some custom operations with the username and password
return super(RemoteAuthSupported, self).get_query_set()
class Test(models.Model):
objects = models.Manager()
remote_supported = RemoteAuthSupported()
# ... the field declarations follow here ... #
我尝试这样做的原因是我在我的 Django 应用程序中使用了非 ORM 数据源,该应用程序需要对其自身进行身份验证,但使用相同的用户名和密码。处理从 Tastypie ModelResource 传递到 Django 模型的参数的方法是什么?我可能应该在这里提一下,没有使用用户模型。