Как добавить пользовательские разрешения для GET, POST, PATCH, DELETE отдельно в представлении функций на основе Django - PullRequest
0 голосов
/ 15 октября 2019

Я работаю над проектом, в котором есть несколько типов пользователей, таких как «Администратор», «Координатор», «Субкоординатор», и каждый пользователь может выполнять разные роли в разных подразделениях. Например. пользователь A может быть координатором в DIVISION XX, затем A может быть администратором в DIVISION YY, но он не может иметь ту же роль в том же подразделении.

Я планирую написать для этого собственные разрешения и роли. то, что я написал, выглядит примерно так:

def coordinator(request, uid):
    if request.method == 'GET':
    //some logic
    if request.method == 'POST':
    //some logic
    if request.method == 'PATCH':
    //some logic
    if request.method == 'DELETE':
    //some logic

что я не хочу сделать, это следующий подход:

def coordiantor_delete(request, uid):
    if request.method == 'DELETE':

def coordiantor_detail(request, uid):
    if request.method == 'GET':

def coordiantor_create(request):
    if request.method == 'POST':

def coordiantor_update(request, uid):
    if request.method == 'PATCH':

Есть ли способ добавитьправа доступа к определенным HTTP-методам функции представления, не разделяя ее на различные представления. Поскольку я хочу иметь только одну конечную точку API, такую ​​как / координатор / и / координатор / идентификатор /, которая должна поддерживать вышеупомянутые методы HTTP, но с разрешениями, такими как администратор, также может удалить координатор из подразделения, а сам координатор также может покинуть подразделение, и никто другойимеет эти полномочия над методом DELETE. Дайте мне знать, каковы возможные подходы к этому или некоторым другим изменениям, которые необходимо внести.

1 Ответ

0 голосов
/ 15 октября 2019

Я отредактировал свой ответ, чтобы лучше соответствовать вашим потребностям. Это не полное решение, и я рассмотрел бы его реорганизацию и настройку в соответствии с вашими потребностями.

У меня есть два решения:

  1. Создать декоратор, принять функциюпроверить наличие ограничений для определенных методов и вызвать PermissionDenied, который вызывает шаблон 403.
  2. Создайте простую функцию, которая выполняет некоторое тестирование, и, если тестирование не пройдено, выведите PermissionDenied. Вызовите эту функцию внутри каждого метода в вашей функции просмотра.

Я предпочитаю метод 1 из-за возможности многократного использования декораторов.

Вот моя первоначальная настройка

from functools import wraps

from django.core.exceptions import PermissionDenied
from django.http import HttpResponse


def permission_denied_test(test_func):
    """
    Decorator for views that raises PermissionDenied if test_func fails
    The test should be a callable and returns True if the test is passed
    Your test function has access to the views request object
    """
    def decorator(view_func):
        @wraps(view_func)
        def _wrapped_view(request, *args, **kwargs):
            if test_func(request):
                return view_func(request, *args, **kwargs)
            raise PermissionDenied
        return _wrapped_view
    return decorator


def coordinator_passes_test(request):
    if request.method == 'GET':
        return True  # passed test
    elif request.method == 'POST':
        return False  # failed test


@permission_denied_test(coordinator_passes_test)
def view(request):
    if request.method == 'GET':
        return HttpResponse('Passed test, this code is reached.')
    elif request.method == 'POST':
        return HttpResponse('Failed test, this code isnt reached.')

Таким образом, ваше тестирование можно использовать повторно, и вы можете легко применить его к нескольким представлениям

...