Как получить ответ 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)