在Django中基于用户身份验证设置模型字段的值

时间:2010-11-04 00:11:36

标签: python django django-models django-sessions

我正在尝试根据用户是否登录来有选择地处理我的Django / Python应用程序中的字段。基本上,我有一个类似于以下的模型:

class Resource(models.Model):
    uploaded = models.DateTimeField()
    name = models.CharField(max_length=200)
    description = models.CharField(max_length=500, blank=True)
    file = models.CharField(max_length=200)

我想要做的是,如果用户恰好登录(并且可以根据针对某些权限后端的测试访问此资源),则将文件属性设置为一个值,如果是用户,则另一个值因此,当任何客户端代码尝试访问Resource.file时,如果用户未登录“http://mysite.com/dummy_resource_for_people_without_access”,它将获得类似以下内容的内容。但是,如果用户登录并通过了一些权限测试,那么resource.file的值实际上将是该资源的真实URL(包括访问该资源的任何安全密钥等)。

从我读过的内容来看,您似乎只能通过将请求上下文从视图函数传递给模型来考虑当前登录的用户。但是,在上面的用例中,我试图在模型中更密切地控制访问,而不需要客户端代码来调用特殊函数。

2 个答案:

答案 0 :(得分:0)

最好的办法是创建一个用于访问文件属性的函数,然后在那里查看。一般情况下,可以将属性转换为隐式执行的描述符,但Django的元类魔法会阻碍它。

然而,一般情况下,Django旨在处理视图级别的身份验证(并且非常干净)。如果需要数据库层身份验证,请考虑其他设置,例如CouchDB。

答案 1 :(得分:0)

为了防止任何人感兴趣,我通过在django中实际创建一个自定义模型字段来解决上述问题,然后可以使用一个方法让用户生成一个URI。因此,在数据库中,我将如上所述的密钥存储在文件列中。但是,现在文件列是一些自定义字段:

class CustomFileField(models.CharField):
    def to_python(self, value):
        ...
        return CustomFileResource(value)


class CustomFileResource:
    def __init__(self, *args, **kwargs):
        ....

    def uri(usr):
       #this method then gets the uri selectively based on the user . 

上面的模式很好,因为我可以包装db字段,然后根据谁试图访问它来创建一个获取uri的特定方法。