Django学习小记[5] —— View Request/Response

在Django中,view是指一个方法,这个方法接收一个request,然后返回一个response.

当客户端发送一个请求的时候,Django会创建一个HttpRequest对象,这个对象包含本次请求的所有相关信息,比如请求的路径,请求的参数,请求的方法等等,然后将这个对象作为view方法的第一个参数传给view,view经过处理之后,返回一个HttpResponse对象,这个HttpResponse对象可以是一段HTML文本,可以是一个重定向,可以是一个404的Error,甚至可以是图片,XML/JSON的文档等等。

举个例子:

from django.http import HttpResponse def index(request): return HttpResponse("this is a test")

通过request参数,可以获得本次请求的所有数据:

(Pdb) request.method 'GET' (Pdb) request.GET <QueryDict: {}> (Pdb) request.path_info u'/model1/' (Pdb) request.META # header

HttpResponse可以带几个参数:

  • content: 返回的内容
  • content_type: 返回内容的类型
  • status

如:

def index(request): return HttpResponse('<p>this is a test</p>', content_type="text/html", status="201") 

好,理解了view的基本原理,其实view基本上已经说完了,现在关于view值得一提的主要有以下几个方面:

  • 对异常的处理
  • shortcut
  • Class-based View

在这篇文章中,只介绍一下前面两个,第三个内容较多,留在下一篇文章中单独去介绍。

Returning errors

我们经常会遇到这样的情况,当你在访问一个很久之前保存的网址时,这个网页已经不存在了,于是出现了各种有意思的画面:

那这在django中是怎么实现的呢?我们先来自己想一下,在所有抛出404异常的地方,捕获这个异常,然后自己渲染一个404的页面。这样虽然可行,但是略麻烦。像报404这种常见的异常,Django都已经做了比较好的封装。在Django里,你可以主动抛出django.http.Http404异常,这样Django会自动去template路径里找一个叫做”404.html”的页面,如果你访问了一个真的不存在的页面,那么同样,django也会去渲染这个页面。

当django发现有Http404异常时,默认它会调用一个特殊的view:

django.views.defaults.page_not_found(request, template_name='404.html')

这个view会去处理404这个异常,返回404页面和404状态码,如果这个view满足不了你的需求的话,可以在配置文件里进行配置,自己指定view方法来处理,如:

handler404 = 'mysite.views.my_custom_404_view'

虽然看起来挺简单的,但是我在测试的时候,还是碰到几个坑的,在这里记下来:

  • 首先要注意的是这种机制只在DEBUG=False时有效,DEBUG=True时会打印出traceback
  • 其次,要确保配置了TEMPLATE_DIRS,把你的templates告诉了django,否则它找不到404页面
  • 如果在设置了DEBUG=False后,所有的路径都报500的话,那么检查一下ALLOWED_HOSTS这个参数,这个参数是为了防止攻击而设置的,在1.4.4~1.5版本,这个参数默认是['*'],接收所有的host,在大于1.5的版本里,这个参数默认[],默认不接收所有的host,所以在大于1.5的版本里,如果设置DEBUG=False的话,ALLOWED_HOSTS这个参数就必须设置,否则会报500。在1.4.4~1.5版本里,可以不设置,它默认就是接收所有的,但是如果设置了的话,就必须要正确,否则也会报500

Shortcuts

Django提供了几个非常有用的“快捷方式”,将我们经常用到的逻辑,封装成了一个方法,简化了代码:

  • render()
  • render_to_response()
  • redirect()
  • get_object_or_404()
  • get_list_or_404()

不进行详细的解释了,看文档吧

Refs

[1] https://docs.djangoproject.com/en/1.6/topics/http/views/ 
[2] https://docs.djangoproject.com/en/1.6/ref/request-response/ 
[3] https://docs.djangoproject.com/en/1.6/topics/http/shortcuts/

你可能感兴趣的:(Django学习小记[5] —— View Request/Response)