0

私が現在取り組んでいる Django プロジェクトは、ローカル ネットワークとインターネットからアクセスする必要がある Web サイトです。認証されたユーザーはコンテンツ全体にアクセスできますが、コンテンツの一部は、ローカルネットワークからサイトにアクセスした場合にのみ匿名ユーザーが利用できるようにする必要があります (基本的には IP アドレスのテストです)。

here で説明されているようにIPを確認することについて考えましたが、ユーザーがページをロードするたびにIPを確認するのはかなり悪いようです。

匿名ユーザーでもユーザーデータをきれいに保存する方法はありますか? のようなデコレータを使用できると便利ですが@login_required、匿名ユーザーが外部 IP を持っている場合にのみリダイレクトされます。

4

1 に答える 1

4

実際、すべてのリクエストで IP をチェックすることは、利用可能な最速の方法の 1 つに思えます。すべてのリクエストでIPがすでにメモリにロードされていることを考慮してください。必要なのは、単純な辞書検索と比較であり、条件付き文字列分割/追加辞書検索を使用します。最も単純なページビューでさえ発生することと比較すると、パフォーマンスへの影響は完全に無視でき、IP を保存するためにセッションまたはその他のメカニズムを使用した場合の影響に匹敵します.

以下を使用して、独自のデコレータ関数を作成できますuser_passes_test

from django.contrib.auth.decorators import user_passes_test
from django.utils.decorators import available_attrs
from functools import wraps

LOCAL_IPS = (
    '127.0.0.1',
    'other_ip',
    'etc.',
)

def is_local_request(request):
    x_forwarded_for = request.META.get('HTTP_X_FORWARDED_FOR')
    if x_forwarded_for:
        ip = x_forwarded_for.split(',')[0]
    else:
        ip = request.META.get('REMOTE_ADDR')
    return ip in LOCAL_IPS

def local_ip_required(view_func):
    def wrapped_view(request, *args, **kwargs):
        if not is_local_request(request):
            raise Http404 # or PermissionDenied or redirect
        return view_func(request, *args, **kwargs)
    return wraps(view_func, assigned=available_attrs(view_func))(wrapped_view)

次に、@local_ip_required を使用します。この実装では、匿名ユーザーとログイン ユーザーの両方が外部の場所からビューにアクセスできないことに注意してください。

于 2013-08-13T09:47:55.067 に答える