Bootstrap

Python-Django-视图

《 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
;