Как получить ответ django-response на запрос django-request

Как отправить django.http.HttpRequest объект и получить django.http.HttpResponse объект внутри представления?

Другими словами, каков аналог python-requests-:

response = requests.request(**data)

используя django.http.HttpRequest и django.http.HttpResponse соответственно

Когда request достигнет вашего представления, он будет иметь вид объекта django.http.HttpRequest. Он создается промежуточным программным обеспечением Django, вам не нужно создавать его самостоятельно.

Это также означает, что вы можете отправлять Django обычные request объекты, и Django обернет их в HttpRequest, прежде чем отдать представлению.

Для django.http.HttpResponse иногда бывает аналогично, так как некоторые предварительно созданные представления конструируют объект ответа незаметно. Но вы можете легко настроить его или создать самостоятельно, если создаете представление «с нуля».

Если вам нужно перехватить ответ, как это делает промежуточное программное обеспечение, вы можете сделать что-то вроде этого:

# views.py

from django.http import HttpResponse

def other_view(request):
    return HttpResponse("<div>Hello world</div>")

def proxy_view(request): # <-- Will be a `HttpRequest` object
    # Fetch the response from the other view
    # NB! Calling views like this bypasses the middleware stack
    proxied_view = other_view(request)
    proxied_content = proxied_view.response.content.decode('utf-8')

    modified_response = "<h1>Hello world</h1>" + "<br>" + proxied_content
    return HttpResponse(modified_response)

Вы можете использовать класс RequestFactory для создания собственного запроса, а затем вызвать с его помощью представление. Пример:

from django.test import RequestFactory
new_request = RequestFactory().get(reverse('url_name', args=(an_arg,)))
# Depending on what you're doing you probably need to populate
# user and META, here I copy them from the current request, but if you
# can't do that you'll have to construct them.
new_request.user = request.user
new_request.META = request.META

# Now you can call your view.. here I am calling a class based view,
# getting the view method using `as_view()`
response = MyViewClass.as_view()(request=new_request)
Вернуться на верх