Как запретить пользователям видеть все содержимое в 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), он только проверяет, вошел пользователь в систему или нет.