Как запретить пользователям видеть все содержимое в Django?

У меня есть сайт, и я хочу запретить посетителям видеть содержимое, если у них нет разрешения. Как я могу их ограничить?

Рекомендую посмотреть Permissions and Authorization в документации django.

Вот один из способов сделать это:

В вашей модели пользователя:

class User(AbstractUser):
    @property
    def has_permission_I_want(self):
        # check permissions here
        # return True or False

В представлении:

from django.contrib.auth.decorators import user_passes_test
@user_passes_test(user.has_permission_I_want)
def some_view(request)
  # Some code here

Ограничение содержимого внутри страницы, передача пользователя в шаблон dict из представления:

return render(
            request, "app/some_page.html",
            {"user": request.user}
        )

и в шаблоне:

{% if user.has_permission_I_want %}
<p> You can see this content </p>
{% endif %}

Также просмотрите этот SO вопрос.

Если вы хотите сделать так, чтобы пользователь должен был войти в систему для доступа к функции, вы можете

from django.contrib.auth.decorators import login_required
@login_required
def some_view(request):
    # Some code inside the function

Проверка разрешений без использования декоратора:

# models.py
from django.db import models
class UserProfile(models.Model):
    has_permission = False

При регистрации пользователя создайте запись в UserProfile

# admin.py
from django.contrib import admin
from app.models import UserProfile
admin.register(UserProfile)

Затем перейдите к администратору, чтобы установить разрешения

def some_view(request):
    user_profile = UserProfile.objects.get(id=request.user.pk)
    if userprofile.has_permission:
        # Give permission
    else:
        # Deny permission

Создание декоратора

Создайте файл, decorators.py в приложении

from django.core.exceptions import PermissionDenied
from simple_decorators.apps.models import Entry

def check_if_deleter_is_author(function):
    def wrap(request, *args, **kwargs):
        post = Post.objects.get(pk=kwargs['post_id'])
        if post.created_by == request.user:
            return function(request, *args, **kwargs)
        else:
            raise PermissionDenied
    wrap.__doc__ = function.__doc__
    wrap.__name__ = function.__name__
    return wrap
# views.py
from app.decorators import check_if_deleter_is_author
@check_if_deleter_is_author
def some_view(request):
    # Some code to delete the post

Ограничение доступа для зарегистрированных пользователей в представлениях на основе функций

Если вы используете представления на основе функций, вы можете просто ограничить доступ к представлению только тем пользователям, которые вошли в систему, украсив функцию декоратором @login_required.

from django.contrib.auth.decorators import login_required

@login_required
def my_view(request):
    return HttpResponse()

В результате этого любой пользователь, который не вошел в систему и пытается получить доступ к представлению по его URL, будет перенаправлен на страницу входа на вашем сайте. Обратите внимание, что этот декоратор не проверяет, активен пользователь или нет (используя свойство is_active), он только проверяет, вошел пользователь в систему или нет.

Источник

Вернуться на верх