0

我正在尝试根据用户是否登录有选择地处理我的 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(包括访问该资源的任何安全密钥等)。

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

4

2 回答 2

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。

于 2010-11-09T19:12:28.727 回答
0

您最好的选择是创建一个用于访问文件属性的函数,并在那里检查。一般来说,可以将属性转换为隐式执行的描述符,但 Django 的元类魔法会阻碍这一点。

然而,一般来说,Django 旨在处理视图级别的身份验证(并且非常干净)。如果您需要数据库层身份验证,请考虑使用不同的设置,例如 CouchDB。

于 2010-11-04T00:29:44.357 回答