2

Я изучаю тестирование в Django и имею представление, которое я хочу проверить. Это мнение должно быть доступно только сотрудникам. Предположим, что точка зрения:Как проверить, что просмотр доступен только пользователям пользователей в Django

def staff_users(request): 
    .... 
    # some logic 

    return HttpResponseRedirect('/repositories/') 

если запрос приходит от пользователей персонала, он должен перенаправить к хранилищам иначе я должен получить что-то вроде permission denied. Я начинаю с чего-то вроде tests.py.

def test_request_object(self): 
     self.user = User.objects.create_user(
     username='abc', email='[email protected]', password='1234') 
     request = HttpRequest() 
     # User send a request to access repositories 
     response = staff_users(request) 
     self.assertIsNone(response) 

Проблема здесь я не связывая мой объект запроса с любыми пользователями, и я должен знать о from django.contrib.admin.views.decorators import staff_member_required, но не знаете, как использовать их здесь. Может ли кто-нибудь сказать мне, как мне проверить, view должен быть доступен только staff users?

ответ

3

Все, что вам нужно сделать, это decorate вашего мнения, которое вы хотите защитить, как показано ниже:

@staff_member_required 
def staff_users(request): 
    .... 
    # some logic 

    return HttpResponseRedirect('/repositories/') 

Если вы хотите пользовательскую логику для тестирования вместо использования Джанго декоратора, то вы можете написать свой собственный декоратор, как Что ж.

def staff_users_only(function): 
    def wrap(request, *args, **kwargs): 

     profile = request.session['user_profile'] 
     if profile is True: #then its a staff member 
      return function(request, *args, **kwargs) 
     else: 
      return HttpResponseRedirect('/') 

    wrap.__doc__=function.__doc__ 
    wrap.__name__=function.__name__ 
    return wrap 

и использовать его как:

@staff_users_only 
def staff_users(request): 
    .... 
    # some logic 

    return HttpResponseRedirect('/repositories/') 

Edit

Ассоциация sessions по запросу объекта для тестирования может быть сделано как:

def test_request_object(self): 
    self.user = User.objects.create_user(
    username='abc', email='[email protected]', password='1234') 
    request = HttpRequest() 
    #create a session which will hold the user profile that will be used in by our custom decorator 
    request.session = {} #Session middleware is not available in UnitTest hence create a blank dictionary for testing purpose 
    request.session['user_profile'] = self.user.is_staff #assuming its django user. 

    # User send a request to access repositories 
    response = staff_users(request) 

    #Check the response type for appropriate action 
    self.assertIsNone(response) 

Edit 2

Кроме того, было бы гораздо лучше использовать Джанго Client библиотеки для тестирования:

>>> from django.test import Client 
>>> c = Client() 
>>> response = c.post('/login/', {'username': 'abc', 'password': '1234'}) 
>>> response.status_code 
200 
>>> response = c.get('/user/protected-page/') 
>>> response.content 
b'<!DOCTYPE html... 
+0

Пожалуйста, также показывают стандартный способ сделать полную отделку: '@wraps (функция)' перед 'Защитой wrap (request, ... ' – Pynchia

+0

Но как насчет тестовых примеров, как мне связать мой запрос с пользователями или обычными пользователями? – python

+0

Если вы видите мою «тестовую функцию», я использую 'request = HttpRequest()' для получения объекта запроса. Как связать объект запроса с персоналом или обычными пользователями? – python