《 Django 框架》课程第 1 次教学 - 视图高级
一、内置错误视图
1 、视图
一个视图函数,简称视图,是一个简单的Python函数,它接受Web请求并且返回Web响应。代码写在哪里也无所
谓,只要它在你的应用目录下面。但是为了方便视图一般被定义在“应用/views.py”文件中。
视图的第一个参数必须为HttpRequest实例,还可能包含下参数如:
通过正则表达式组获得参数
视图必须返回一个HttpResponse对象或子对象作为响应。
2 、错误视图
Django内置处理HTTP错误的视图,主要错误及视图包括
404 错误:pagenotfound视图
500 错误:server error视图
400 错误:bad request视图
403 错误:permission_denied视图
如果想要看到错误视图,而不是错误调试信息的需要设置setting.py配置文件的调试开关设置为False:
ALLOWED_HOSTS允许所有主机访问。
DEBUG = False ALLOWED_HOSTS = ["*",]
404 错误及视图
将请求地址进行url匹配后,没有找到匹配的正则表达式,则调用 404 视图,这个视图会调用 404 .html的模板
进行渲染
404 视图默认情况下定义在'django.views.defaults.page_not_found'
django自带 404 模板
视图传递变量request_path给模板,是导致错误的URL
自定义错误模板:在项目的templates目录下创建一个名字叫 404 .html的模板文件:当发生 404 错误时, 404
视图会调用templates中的模板文件而不再调用自带的模板。
其他错误处理方式相同。
3 、自定义错误视图
Django中默认的错误视图对于大多数web应用已经足够了,但是如果你需要任何自定义行为,只要在你的URLconf
中指定下面的处理器(在其他任何地方设置它们不会有效)。
在应用下的urls.py中自定义错误视图。 handler 404 覆盖了page_not_found()视图:
404 自定义错误视图
def my_page_not_found_view(request):
'''404错误视图'''
return HttpResponse('请求不存在')
访问错误url
其他错误视图跟 404 错误一样。 handler 500 覆盖了server_error()视图:
handler 500 ='mysite.views.my_custom_error_view'
handler 403 覆盖了permission_denied()视图:
handler403 = 'mysite.views.my_custom_permission_denied_view'
handler 400 覆盖了bad_request()视图:
handler400 = 'mysite.views.my_custom_bad_request_view'
4 、模型类 get 方法错误处理
在讲模型的get方法的时候讲到过,使用get方法如果数据不存在会抛出一个DoesNotExist的异常.比如用户访问
博客的详细页请求传过来一个id据库中不存在,那么用户就会看到报错页面。
get_object_or_ 404 的介绍: 我们原来调用django 的get方法,如果查询的对象不存在的话,会抛出一个
DoesNotExist的异常。现在我们调用djangoget_object_or_ 404 方法,它会默认的调用django的get方法,如果
查询的对象不存在的话,会抛出一个Http 404 的异常,返回 404 错误页面。这样用户就不会觉得是服务器异常。而
是自己访问的路径不对。
from django.shortcuts import get_object_or_404
def detail(request, id):
# post = Post.post_object.get(pk=id)
post = get_object_or_404(Post,pk=id) # 调用get_object_or_404方法,如果没有错误返回结果
return render(request, 'personal_blog/detail.html', context={"post": post})
get_object_or_ 404 第一个参数是需要查询的模型类, 第二个参数是 查询条件。
二、HttpRequest 对象
1 、 HttpRequest
服务器接收到http协议的请求后,Django会建立一个包含请求元数据的HttpRequest对象,这个对象不需要
我们创建,直接使用服务器构造好的对象使用就可以
2 、属性
scheme: 一个字符串,表示请求的方案(通常是http 或https)。
body: 一个字节字符串,表示原始HTTP 请求的正文。
path: 一个字符串,表示请求的页面的完整路径,不包含域名
method:一个字符串,表示请求使用的HTTP 方法。常用值包括:'GET'、'POST'
encoding:一个字符串,表示提交的数据的编码方式(如果为None 则表示使用DEFAULT_CHARSET 设置,一般 为utf-8)。这个属性是可写的,你可以修改它来修改访问表单数据使用的编码。接下来对属性的任何访问(例如从 GET 或 POST 中读取数据)将使用新的encoding 值
GET: 一个类似于字典的对象,包含HTTP GET 的所有参数 POST: 一个包含所有给定的HTTP POST参数的类字典对象,提供了包含表单数据的请求。
COOKIES:一个标准的Python 字典,包含所有的cookie。键和值都为字符串。
FILES: 一个类似于字典的对象,包含所有的上传文件。FILES 中的每个键为 中的name。 session:一个既可读又可写的类似于字典的对象,表示当前的会话。只有当Django 启用会话的支持时才可用。
META:一个标准的Python 字典,包含所有的HTTP 头部。
CONTENT_LENGTH —— 请求的正文的长度(是一个字符串)。
CONTENT_TYPE —— 请求的正文的MIME 类型。
HTTP_ACCEPT —— 响应可接收的Content-Type。
HTTP_ACCEPT_ENCODING —— 响应可接收的编码。
HTTP_ACCEPT_LANGUAGE —— 响应可接收的语言。
HTTP_HOST —— 客服端发送的HTTP Host 头部。 HTTP_REFERER —— Referring 页面。
HTTP_USER_AGENT —— 客户端的user-agent 字符串。
QUERY_STRING —— 单个字符串形式的查询字符串(未解析过的形式)。
REMOTE_ADDR —— 客户端的IP 地址。 REMOTE_HOST —— 客户端的主机名。 REMOTE_USER —— 服务器认证后的用户。
REQUEST_METHOD —— 一个字符串,例如"GET" 或"POST"。
SERVER_NAME —— 服务器的主机名。 SERVER_PORT —— 服务器的端口(是一个字符串)。
在浏览器中开发者工具->网络 中可以看到请求信息:
示例:scheme,path,encoding:
def info(request):
# HttpRequest对象属性
str = '请求的方案:%s</br>路径:%s</br>编码%s'(request.scheme,request.path,request.encoding)
return HttpResponse(str)
method 表示请求使用的HTTP方式创建三个视图:
def method1(request):
return render(request,'personal_blog/method1.html')
def method2(request):
return HttpResponse(request.method) # 返回请求方式
def method3(request):
return HttpResponse(request.method) # 返回请求方式
配置URL:
url(r'^method1/$', views.method1),
url(r'^method2/$', views.method2),
url(r'^method3/$', views.method3),
创建模板:method1.html 写入下面内容:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body> <a href="/blog/method2/">方式一:get</a>
</br> </br>
</br> <for