0

次の URL があるとします。

example.com/users/1

ID=1 のユーザーがそれを開くと、ユーザーは自分のアカウントに関する情報を受け取りますが、ユーザーが 1 を 2 に切り替えると、他のユーザーの詳細も表示できます。もちろんそれは望ましくないため、次の解決策があります。

1)現在ログインしているユーザーIDを渡すだけで、テンプレート内にrequest.user.idがスローされました

2)許可を追加しますが、それを許可する許可の種類が見つかりませんでした。もちろん、ユーザーごとに何十ものアクセス許可を作成することもできますが、もちろんそれは非常に厄介な方法です。

Djangoでそれに対処する方法は他にありますか?

4

2 に答える 2

1

これを行うには許可は必要ありません。あなたのviews.pyで

from django.http import Http404

def myview(request, user_id):

  user = request.user
  if user_id != request.user.id:
      raise Http404

  #all your logic here

ただし、ユーザープロファイルを非公開にする場合は、URLパターンでuser_idを使用する必要はありません。リクエスト変数に格納されているユーザーオブジェクトを使用するだけです。

于 2012-09-21T11:03:23.570 に答える
1

ユーザーが別のユーザーのデータを決して見ないようにする要求でコンテキストを埋めることができます。たとえば、(CBV を使用して):

class AccountView(TemplateView):
    """
    Generic account view
    """
    template_name = "users/account.html"

    def get_context_data(self, **kwargs):
        context = super(AccountView, self).get_context_data(**kwargs)
        context['user'] = User.objects.get(id=self.request.user.id) 
        return context

    @method_decorator(login_required(login_url=reverse('login')))
    def dispatch(self, *args, **kwargs):
        return super(AccountView, self).dispatch(*args, **kwargs)

「偽の」URLが404をレンダリングすることを確認する別のアプローチは、 owner_required デコレータを書くことです。

def owner_required(function):
    @wraps(function)
    def decorator(*args, **kwargs):
        request = args[1]
        user = get_object_or_404(User, username=request.user.username)
        if user.is_authenticated() and user.username == kwargs.get('slug'):
            return function(*args, **kwargs)
        raise Http404
    return decorator
于 2012-09-21T10:43:47.743 に答える