此文翻译自django1.8.2的官方文档,The view layer中的Built-in-Views段
Built-in Views
文档中的writing views部分及其他部分用到了一些django的内置视图.
Servint files in development(开发阶段的静态文件处理)
- static.serve(request, path, document_root, show_indexed=False)
可能有项目的静态资产(注:py文件)之外的文件要处理,为了方便,你可以在本地开发时用django serve.视图serve()能够用于任何你给定的目录.(这个视图不够强大,只能用于开发环境,不要用于生产环境,生产环境里应该使用真正的前端web server).
最常用的例子是在MEDIA_ROOT里用户上传的内容.django.contrib.staticfiles是为了处理静态资产,而且没有内置函数来处理用户上传的文件,但是你可以用django处理MEDIA_ROOT,通过在你的URLconf里添加内容:
from django.conf import settings
from django.views.static import serve
# ...the rest of your URLconf goes here...
if setting.DEBUG:
urlpatterns += [
url(r'^media/(?P<path>.*)$', serve, {'document_root': 'settings.MEDIA_ROOT'}),
]
注意:这段代码假设你的MEDIA_URL的值是’/media/’.他会调用serve()视图,传递URLconf里的路径和document_root(必需)变量.
因为这样定义URL pattern有点复杂,django自带一个小URL helper函数static().
Error views
django自带处理HTTP错误的几个视图.如果想要重写你自己定制的视图,请看Customizing error views.
The 404 (page not fount) view
- 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.
关于404视图有3点要注意:
- 如果django在URLconf里检查了每个正则都没有找到匹配URL的,也会调用404视图.
- 404视图会传递RequestContext,并连接到template context processers(例如MEDIA_URL)提供的变量.
- 如果DEBUG设置为True(在setting模块里).那么你的404视图就不会被使用,而是URLconf起作用,会有一些debug信息.
The 500 (server error) view
- defaults.server_error(request, template_name=’500.html’)
在视图代码里,如果有运行时错误,django会执行特定的行为.如果一个视图有异常.默认,django会调用视图django.views.defaults.server_error,提供一个简单的’Server Error’信息或加载并渲染500.html如果你在模板根目录里创建了500.html.
默认的500视图不会传参给500.html模板,并且会用空的Context来渲染,以免造成其他错误.
如果DEBUT设置为True,500视图不会被调用,traceback和一些debug信息会显示.
The 403 (HTTP Forbidden) view
- defaults.permission_denied(request, template_name=’403.html’)
和400,500视图风格相同,django有视图处理403 Forbidden错误.如果视图抛出了403异常,默认,django会调用视图django.views.defaults.permission_denied.
这个视图加载并渲染模板根目录下的403.html.如果文件不存在,会提供文本’403 Forbidden.’,这符合RFC 2616(HTTP1.1标准).
django.views.defaults.permission_denied会被PermissionDenied异常触发.你可以这样在代码中拒绝访问.
from django.core.exceptions import PermissionDenied
def edit(request, pk):
if not request.user.is_staff:
raise PermissionDenied
# ...
The 400 (bad request) view
- defaults.bad_request(request, template_name=’400.html’)
When a SuspiciousOperation is raised in Django, it may be handled by a component of Django (for example resetting the session data). If not specifically handled, Django will consider the current request a ‘bad request’ instead of a server error.
django.views.defaults.bad_request, is otherwise very similar to the server_error view, but returns with the status code 400 indicating that the error condition was the result of a client operation.
bad_request views are also only used when DEBUG is False.