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)

私がやりたいのは、ユーザーがログインしている場合(および、いくつかのアクセス許可バックエンドに対するテストに基づいてこのリソースにアクセスできる場合)、ファイル属性を1つの値に設定し、ユーザーがログインしていない場合は別の値に設定することです。したがって、クライアントコードがResource.fileにアクセスしようとすると、ユーザーが「http://mysite.com/dummy_resource_for_people_without_access」にログインしていない場合、次のようになります。ただし、ユーザーがログインしてアクセス許可のテストに合格した場合、resource.fileの値は、実際にはそのリソースの実際のURLになります(そのリソースにアクセスするためのセキュリティキーなどを含む)。

私が読んだことから、現在ログインしているユーザーは、ビュー関数からモデルへのリクエストコンテキストを介して渡すことによってのみ考慮できるようです。ただし、上記のユースケースでは、特別な関数を呼び出すためのクライアントコードを必要とせずに、モデル内のアクセスをより厳密に制御しようとしています。

4

2 に答える 2

0

最善の策は、ファイル属性にアクセスするために使用される関数を作成し、そこでチェックすることです。一般に、属性を暗黙的に実行する記述子に変換することは可能ですが、Djangoのメタクラスの魔法はそれを妨げます。

ただし、一般的に、Djangoはビューレベルで認証を処理するように設計されています(そしてそれを非常にきれいに行います)。データベース層の認証が必要な場合は、CouchDBなどの別のセットアップを検討してください。

于 2010-11-04T00:29:44.357 に答える
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 に答える