PythonTip >> 博文 >> Django

django的view函数(翻译)

zihua 2014-01-20 18:01:08 点击: 1000 | 收藏


It is now %s. " return HttpResponse(html)

 

  让我们一步步研究这些代码。

  首先,我们从django.http模块中引入了HttpResponse类,同时也引入了python的datetime库。

  接下来,我们定义了一个函数,名叫 current_datetime。这正是一个视图函数。每一个视图函数都会把一个HttpRequest对象作为它的第一个参数,典型的,这个参数被称为request。

  视图函数被怎样取名倒是没什么关系,不需要为了让django理解而特意用一些古怪的名字。我们这里把函数取名为current_datetime----很容易就能知道这个函数究竟干了什么。

  视图返回了一个包含了生成请求的HttpResponse对象----通常,每一个视图都应该规矩地返回一个HttpResponse对象(这里有一些例外,不过我们稍后会讨论)。

 

  映射urls到视图上

  概括地说,视图函数返回一个包含现在日期和时间的html页面。为了在对应的链接上展示这些页面,你需要创建一个URLconf(这部分如果需要翻译的话,我会后面补上)。

   

  返回错误

  在django中,编写返回http错误的代码是一件简单的活。django提供了一些处理除了200(这个状态意味着成功)之外的其他http状态的类----都是HttpResponse的子类。你可以在request/response 文档中找到一个详细列表。

  通过提供的子类,通常你可以这样做来表明这个页面有误。

def my_view(request):
    if foo:
        return HttpResponseNotFound('

Page not found

) else: return HttpResponse('

Page was found

')

 

  当然了,这样不能处理各种各样的http状态,所以你其实可以传递进入一个特定的http状态码----通过这样的方式来处理各种各样的状态。比如这样:

def my_view(request):
    return HttpResponse(status=201)

  考虑到404错误相当常见,这里有一个简单的处理方式。

 

  http404错误

  如果你返回了一个错误,比如 HttpResponseNotFound,你就有责任去定义一个html页面处理这个错误

    return HttpResponseNotFound('<h1 >Page not found</h1 >')

  为了处理起来更加方便----同时也因为有一个通用的处理404错误的方法是一个不错的点子。django提供了Http404错误。如果在视图函数中引发了Http404异常,django将会捕获它,然后返回你的标准错误页面,还附送一个http 404错误码。

from django.http import Http404

def detail(request,poll_id):
    try:
        p = Poll.objects.get(pk=poll_id)
    except Poll.DoesNotExist:
        raise Http404
    return render_to_tesponse('polls/detail.html',{'poll':p})

  为了最大化地利用好Http404异常,你应该创建一个模板,当出现404错误的时候就展示它。这个模板应该被命名为404.html,并且放在你模板数的最顶层。

 

  典型的错误视图

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

  当你引发一个Http404错误,django会载入一个特殊的视图去处理404错误。默认的是django.views.defaults.page_not_found,它会简单地显示 "Not Found" 信息。或者,如果你创建了404.html页面的话,会显示你创建的那个。

  默认的404视图会传递一个 request_path 参数到模板中去,通常这是引发错误的url。

  对99%的web应用来说,page_not_found 视图已经足够了,但是如果你真的希望重写它,你可以指定 handler404进你的URLconf,就像这样:

handler404 = 'mysite.views.my_custom_404_view'

  通常,django将会在你的root URLconf中寻找handler404,没定义的话,就会返回 django.views.defaults.page_not_found 这样。

  对404视图,需要说明的是这些:

  1.404视图代表django检查过所有定义的正则式之后依然没找到这个界面。

  2.404视图被传递一个 RquestContext 然后会取得在你的 TEMPLATE_CONTEXT_PROCESSORS 设置中提供的变量。

  3.如果DEBUG被设置为True(在你的设置模块中)。404页面将不会被使用,取而代之的是你的URLconf以及一些调试信息。

 

  500(服务器错误)视图。

  类似的,django的视图函数一旦在运行时出现错误,并且视图执行结果是一个异常。Django默认地,会调用 django.views.defaults.server_error视图,这玩意也只是显示简单的服务器错误信息或者载入500.html(如果有的话)

  500视图不会传递给500.html任何参数。

  同样,server_error对99%的web应用都是足够的,然后你也可以重写它:

handler500 = 'mysite.views.my_custom_error_view'

  关于500错误,这些需要注意:

  如果DEBUG设置为True,你的500视图将不会被使用,只会显示一些调试信息。

 

  403(HTTP 禁止)视图。

  和404,500类似,默认的,也有一个 django.view.defaults.permission_denied去处理403错误。

  也同样,如果定义了403.html,django将会调用它。

  django.views.defaults.permission_denied 会被PermissionDenied异常触发。为了禁止访问,你可以这样做:

from django.core.exceptions import PermissionDenied

def edit(request,pk):
    if not request.urer.is_staff:
        raise PermissionDenied

  用同样的方式,你也可以在URLconf中指定一个 handler403

handler403 = 'mysite.views.my_custom_permission_denied_view

 

 

関連記事:

原文链接:http://www.tuicool.com/articles/3Y7r6z

作者:zihua | 分类: Django | 标签: django | 阅读: 1000 | 发布于: 2014-01-20 18时 |