Создание фальшивого запроса для рендеринга представления в строку в django - PullRequest
4 голосов
/ 31 августа 2011

Проблема

Я хотел бы отобразить произвольное представление, вызвав его (захватите ответ и извлеките визуализированный контент), в строку внутри другого представления.Проблема в том, что я хотел бы, чтобы фиктивный пользователь "вошел в систему" во время рендеринга этого представления, а также изменил несколько других незначительных вещей в запросе.Чего я хотел бы избежать, так это полностью создать запрос с нуля, так как 90% запроса, который я буду иметь под родительским представлением, будет таким же.

Мне интересно, как мне поступитьоб этом, что касается передовой практики, а также технически?

В настоящее время я думаю что-то вроде этого: (Но я не могу помочь, но чувствую, что это ужасно, и должен быть лучший способЯ просто не могу думать об этом)

Просмотр материала ...

Выход из системы текущего пользователя

Создание / вход в систему фиктивного пользователя

Каким-то образомнемного измените запрос

Отобразите представление в строку

Выйдите из фиктивного пользователя

Войдите в систему, используя первоначального пользователя

Материал конца просмотра ...

Есть идеи?Или указатель в лучшую сторону?

Спасибо, dennmat

Ответы [ 3 ]

2 голосов
/ 31 августа 2011

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

def _real_view(user):
    return render_to_response('template.html', {'user' : user})

def view(request):
    # Now both of these are possible...
    response = _real_view(User.objects.get(5))
    response = _real_view(request.user)
    return response

Затем, когда вы хотите просмотреть представление с использованием другого пользователя, вам нужно только получить информацию дляэтот пользователь и передать его в поле зрения.Нет необходимости менять текущего пользователя или изменять запрос вообще.

1 голос
/ 04 февраля 2014

просто используйте тестовый клиент - это не только хорошо для тестирования:

from django.test import Client

c = Client()
# login if necessary
c.login(username='dummy', password='user')
# get the view
response = c.get(reverse('my-view', args=[foo,bar])
html = response.content

Начиная с 1.6 это даже официально задокументировано, однако оно работает и в более старых версиях: https://docs.djangoproject.com/en/1.6/topics/testing/tools/#module-django.test.client

1 голос
/ 31 августа 2011

На самом деле вам не нужно выходить из системы текущего пользователя, вы можете просто изменить пользователя в объекте HttpRequest, который вы планируете использовать для визуализации другого представления. Вы могли бы сделать что-то вроде этого:

from django.contrib.auth.models import User
from django.http import HttpResponse

def view_inside_a_view(request):
    return HttpResponse('hello %s' % request.user)

def view(request):
    # change to dummy user, or whoever
    request.user = User.objects.get(id=1)
    response = view_inside_a_view(request)
    return HttpResponse('rendered view: %s' % response.content)

Если вам нужно войти в систему вашего фиктивного пользователя, вы можете использовать django.contrib.auth.authenticate или или django.contrib.auth.login. Пример использования login (избегает необходимости использовать фиктивный пароль пользователя):

from django.contrib.auth.models import User
from django.contrib.auth import login, get_backends
from django.contrib.auth.decorators import login_required
from django.http import HttpResponse

@login_required
def view_inside_a_view(request):
    return HttpResponse('hello %s' % request.user)

def view(request):
    # login dummy user
    user = User.objects.get(id=2)
    backend = get_backends()[0]
    user.backend = "%s.%s" % (backend.__module__, backend.__class__.__name__)
    login(request, user)
    # change request's user
    request.user = user
    # get response from view
    response = view_inside_a_view(request)
    return HttpResponse('rendered view: %s' % response.content)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...