Django基础之response详解

Request 和 Response 对象起到了服务器与客户机之间的信息传递作用。Request 对象用于接收客户端浏览器提交的数据,而 Response 对象的功能则是将服务器端的数据发送到客户端浏览器。 

对于 HttpRequest 对象来说,是由 Django 自动创建, 但是,HttpResponse 对象就必须我们自己创建。每个 视图函数必须返回一个 HttpResponse 对象。HttpResponse 类在 django.http.HttpResponse中要使用它首先应该导入

from django.http import HttpResponse

 

构造HttpResponse对象

from django.http import HttpResponse
from django.template import loader


def my_view(request):
    customize = '<h2>自定制HttpResponse</h2>'
    t = loader.get_template('index.html')
    c = {'customize': customize}
    return HttpResponse(t.render(c, request), content_type='text/html')

详情参考官方文档:https://docs.djangoproject.com/en/1.11/topics/http/shortcuts/

 

render方法 (渲染模板)

由于使用HttpResponse构造HttpResponse对象太复杂所以Django给我们提供了一个render方法。是的返回一个HttpResponse变得简单。

render(request,template_name,context = None,content_type = None,status = None,using = None)

# 结合一个给定的模板和一个给定的上下文字典,并返回一个渲染后的 HttpResponse 对象。通俗的讲就是把context的内容, 加载进templates中定义的文件, 并通过浏览器渲染呈现.

参数详解:

  • request: 固定参数, 用于生成此响应的请求对象。
  • template_name: templates 目录中定义的文件, 要注意路径名。
  • context: 要传入文件中用于渲染呈现的数据, 默认是字典格式
  • content_type: 生成的文档要使用的MIME 类型。默认为DEFAULT_CONTENT_TYPE 设置的值。
  • status: http的响应代码,默认是200.
  • using: 用于加载模板使用的模板引擎的名称。
from django.shortcuts import render

def my_view(request):
    num = 2016
    return render(request, 'index.html', {'num': num})

 

render_to_response方法

render_to_responsetemplate_namecontext = Nonecontent_type = Nonestatus = Noneusing = None

render_to_response方法比render方法还要简单,他返回时不需要传递request对象,上面的代码我们也可以写成这样

from django.shortcuts import render_to_response

def my_view(request):
    num = 2016
    return render_to_response('index.html',{'num': num})

官方不推荐使用render_to_response,将来可能会被移除。

 

redirect方法 (重定向)

redirect(to,permanent = False,* args,** kwargs)
# 将HttpResponseRedirect返回给传递参数的相应URL。

这个参数可以是:

  • 模型:模型的get_absolute_url() 功能将被调用。
  • 视图名称,可能带有参数:reverse()将用于反向解析名称。
  • 绝对或相对URL,将用于重定向位置。

示例:

1、通过传递一些对象; 该对象的 get_absolute_url()方法将被调用来找出重定向URL:

from django.shortcuts import redirect

def my_view(request):
    ...
    object = MyModel.objects.get(...)
    return redirect(object)

2、通过传递一个视图的名称和可选的一些位置或关键字参数; 该URL将通过以下reverse()方法反向解析 

def my_view(request):
    ...
    return redirect('some-view-name', foo='bar')

3、通过传递一个硬编码的URL重定向到: 

def my_view(request):
    ...
    return redirect('/some/url/')

4、这也适用于完整的网址:

def my_view(request):
    ...
    return redirect('https://example.com/')

默认情况下,redirect()返回一个临时重定向。所有上述形式都接受permanent参数; 如果设置为True则返回永久重定向:

def my_view(request):
    ...
    object = MyModel.objects.get(...)
    return redirect(object, permanent=True)

详情参考官方文档:https://docs.djangoproject.com/en/1.11/topics/http/shortcuts/

 

locals()方法

# 将视图函数中的所有变量全部传给模板

def data(request):
    year = 2016
    month = 12
    day = 12
    return render(request, locals())
def data(request):
    year = 2016
    month = 12
    day = 12
    return render(request, {'year': year, 'month': month, 'day': day})

以上两种写法作用相同。

 

HttpResponse的子类

Django包含许多处理不同类型的HTTP请求的 HttpResponse 子类。像 HttpResponse 一样,这些类在 django.http 中。

类名描述
HttpResponseRedirect                                       构造函数的参数只有一个:重定向的路径。 它可以是一个完整的URL(例如, ‘http://www.baidu.com/‘ )或者不包括域名的相对路径(如 '/index/' ),它返回 HTTP 状态码 302。
HttpResponsePermanentRedirect 类似 HttpResponseRedirect , 但是它返回一个永久重定向 ,而不是暂时性转移,返回状态码301
HttpResponseNotFound 返回状态码404
JsonResponse 返回Json字符串
posted @ 2018-01-30 17:01  流星之泪  阅读(1126)  评论(0)    收藏  举报