一个视图函数,简称视图,是一个简单的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对象,这个对象不需要
我们创建,直接使用服务器构造好的对象使用就可以
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路径:%s编码%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 写入下面内容:
Title
方式一:get
浏览其中访问:http://127.0.0.1:8000/blog/method1/ 点击链接 方式一:get,转到method2,浏览器接收到请求方式’GET’
点击链接 方式二:post, 转到method3,会出现拒绝访问。django默认开启 csrf 跨站请求伪造,后面会详细讲, 这里先将csrf关闭。
将项目目录的settings.py文件,将MIDDLEWARE_CLASSES项的csrf注释
MIDDLEWARE_CLASSES=(
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
#'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.auth.middleware.SessionAuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
'django.middleware.security.SecurityMiddleware',
)
注释之后重新访问:
META 一个标准的Python 字典,包含所有的HTTP头部。
defmetainfo(request):
m=request.META
str=''
# 将http请求头拼接返回给浏览器,查看http请求头信息
forkey,valueinm.items():
str+='%s:%s'%(key,value)+''return
HttpResponse(str)
配置ur
url(r'^metainfo/$',views.metainfo),
在浏览器访问; http://127.0.0.1:8000/blog/metainfo/
在HttpRequest 对象中,GET 和POST 属性是django.http.QueryDict 的实例,它是一个自定义的类似字典的
类,用来处理同一个键带有多个值。与python字典不同,QueryDict类型的对象用来处理同一个键带有多个值
的情况
方法:get:根据键获取值,如果一个键同时拥有多个值将获取最后一个值,如果键不存在则返回None值,可以设置
默认值进行后续处理
getlist:根据键获取值,值以列表返回,可以获取指定键的所有值如果键不存在则返回空列表[],可以设置默认值
进行后续处理
这两个方法用于获取url? 号后面的参数
get():
dict=request.GET
dict.get('键','默认值') # 如果GET参数里没有这个键,那么将使用默认值。默认值是一个可选参数
getlist():
dict=request.GET
dict.getlist('键','默认值') # 获取一键多值的情况,返回指定键的所有值的列表
4 、 GET 属性
请求参数:在请求地址结尾使用?,之后以“键=值”的格式拼接,多个键值对之间以&连接例如:
https://www.baidu.com/s?ie=UTF-8&wd=pythonie=UTF-8&wd=python ?之后的就是请求参数
请求参数键ie,wd值分别为UTF- 8 ,python
在Django中可以使用HttpRequest对象的GET属性获得get方式请求的参数,如果是post请求则用POST属性获取请求
参数。
键是开发人员在编写代码时指定的,值可能是用户输入,或者动态生成。
示例:
在创建一个模板get.html,编辑两个a标签
personal_blog/get.html
Title
get:一键一值
get 2 :一键多值