0

私は既存のデータベース/ユーザー フレームワークの上で Django を使用しているため、残念ながら Django 認証フレームワークを使用することはできません。

カスタム認証ライブラリを構築しましたが、テンプレートでの使用方法を理解する必要があります。特定のリンクは、アクセス権を持つユーザーにのみ表示される必要があります。

PHPでは、このようなことができます

<?php if auth('RestrictedLinkName') {?> <a href=""></a> <?php } ?>

ジャンゴのやり方とは?カスタムタグで遊んでいますが、まだ機能していません。私は次のようなことを考えていました:

{% if check_permission('Restrictedarea') %} hjkfgdkhfg  {% endif %}
4

2 に答える 2

1

評価する必要がある場合check_permission('Restrictedarea')は、ビュー関数で実行し、評価結果をテンプレートに渡します。

djangobookは次のように述べています (第 4 章: テンプレート、哲学と制限セクション) -

ビジネス ロジックは、プレゼンテーション ロジックから分離する必要があります。Django の開発者は、テンプレート システムを、プレゼンテーションおよびプレゼンテーション関連のロジックを制御するツールと見なしています。それだけです。テンプレート システムは、この基本的な目標を超える機能をサポートすべきではありません。

そのため、Django テンプレート内で Python コードを直接呼び出すことはできません。すべての「プログラミング」は、基本的に、テンプレート タグが実行できる範囲に制限されています。任意のことを行うカスタム テンプレート タグを作成することは可能ですが、すぐに使用できる Django テンプレート タグは意図的に任意の Python コードの実行を許可していません。

また、カスタム タグを記述する必要がある場合は、次のリンクを確認してください。

于 2013-05-17T09:15:00.783 に答える
0

カスタム テンプレート タグとフィルタを作成できます。ただし、これはある程度までは役立つ場合があります。さらに、カスタムの context_processors (および必要に応じてカスタムのミドルウェア) を作成する必要があります。

ただし、カスタム関数を使用して認証と権限チェックを行うのは非常に困難ですが、可能です。カスタム認証/承認でシステムを完全に実行しています。

まず、djangocontext_processorsを調べて、それらがどのように機能するかを理解できます。その後、カスタムを書くことができますcontext_processor。設定にコンテキスト プロセッサを追加すると、これらのメソッドを使用して、必要に応じて認証/承認を行うことができます。

私のカスタムcontect_processor関数の1つは次のようなものです:

from django.utils.functional import lazy

def CustomProcessor(request):
    cust_perms = {
        'admin_perm_check': lazy(lambda: myCustomPermChecker(request), myCustomPermChecker)(),
        'system_admin': aFunctionToReturnBoolValue(),
    }
    return custom_perms

class myCustomPermChecker(object):
    def __init__(self, request):
        self.request = request

    def __getitem__(self, perm_name):
        return True if (perm_name in user_perm_list()) else False

テンプレートで

{%if admin_perm_check.perm_name%}...{%endif%}
{%if system_admin %} this is a bool check{%endif%}

__getitem__テンプレートタグが機能するように、permchecker をメソッドを持つクラスとして定義する必要がありますadmin_perm_check.perm_name。この perm チェッカーは、1 つの追加パラメーター ( perm_name) のみを受け入れます。django スタイルの 2 つのパラメーター チェックを使用する場合は、次のようにする必要があります。

class myCustomPermChecker(object):
    def __init__(self):
        pass

    def __getitem__(self, module_name):
        return SecondPermCheckerStep(module_name)

class SecondPermCheckerStep(object):
    def __init__(self, module_name):
        self.module_name = module_name

    def __getitem__(self, perm_name)
        return True if ('%s.%s' % (self.module_name,perm_name) in user_perm_list()) else False


{%if admin_perm_check.module_name.perm_name%}

別のキーを使用class.__getitem__して、テンプレートなどのツアー タグ チェーンにもう 1 つキーを追加できます。

context_processorはオブジェクトをパラメーターとしてCustomProcessor(request):受け入れるhttp.requestため、認証または承認に必要な任意の値 (セッション ID またはユーザー ID など) をメソッドまたは関数に渡すことができます。カスタム値をリクエストオブジェクトに設定して使用するミドルウェアを作成できます(django set userinstanceのようrequest.userに、ビューで使用できます)。テンプレート (request_context で設定した場合) やビュー (ミドルウェアで設定した場合) で使用できるように、カスタム ユーザー モデル インスタンスを設定することもできます。

ここではドキュメントを読んでもあまり役に立ちません。django コードをチェックして、django がこれをどのように処理するかを確認することをお勧めします。

于 2013-05-17T09:31:39.657 に答える