项目名:mydemo2
Python版本:3.7.0
Django版本:3.2.0
Django的视图层(View)介绍
- Django框架中的视图(View)是用来负责处理用户请求和返回响应的逻辑程序。
- 视图(View)简而言之就是一个Python的函数或方法,接受Web请求并且返回Web响应。
- 无论视图本身包含什么逻辑,都要返回响应,响应可以是网页的HTML内容,重定向或404错误,XML文档或图像。
- 视图层中包含两个重要对象:请求对象(request)和响应对象(HttpResponse)。
- 视图的代码通常是放在view.py文件中,此文件放在项目主目录或应用程序目录中。
1.返回一个模板
from django.shortcuts import render
def index(request):
return render(request,'index.html')
2.返回当前时间的简单视图
from django.http import HttpResponse
import time
def nowtime(request):
now=time.strftime('%Y-%m-%d %H:%M:%S',time.localtime())
html="<html><body>现在的时间是%s</body><html>"%now
return HttpResponse(html)
3.返回一个错误页面
def error(request):
# 直接返回一个404,没有去加载404的模板页面
return HttpResponseNotFound('<h1>Page not found</h1>')
# 可以直接返回一个status状态码
# return HttpResponse(status=403)
# 返回一个404的错误页面
#raise Http404("Poll does not exist")
4.重定向
重定向就是通过方法将网络请求重新定向跳转到其他位置
from django.shortcuts import redirect
from django.urls import reverse
def resp(request):
# redirect重定向 reverse反向解析url地址
return redirect(reverse('nowtime')) #重定向到时间显示页面
#执行一段js代码,用js进行重定向
#return HttpResponse('<script>alert("跳转成功");location.href = "/nowtime"; </script>')
# 加载一个提醒信息的跳转页面
# context = {'info': '跳转成功'}
# return render(request, 'info.html', context)
5.基于类的基本视图
views.py
from django.views import View
class MyView(View):
def get(self, request, *args, **kwargs):
return HttpResponse('这是一个类')
myapp/urls.py
from django.urls import path,include
from . import views
from myapp.views import MyView
urlpatterns = [
path('',views.index,name='index'), #首页
path('nowtime/',views.nowtime,name='nowtime'), #当前时间
path('error/',views.error,name='error'), #错误页面
path('resp/',views.resp,name='resp'), #重定向
path('class/',MyView.as_view(),name='class') #基于类的基本视图
]
其中as_view()是接受请求并返回响应的可调用视图['get','post','put', 'patch','delete,'options'.]
HttpResponse对象
- HttpResponse():返回文本,参数为字符串,字符串中写文本内容。如果参数为字符串里含有 html 标签,也可以渲染。
- 在django.http模块中定义了HttpResponse对象的API。
- HttpRequest对象由Django自动创建,HttpResponse对象由程序员创建。
- 每个视图函数都必须返回一个HttpResponse对象或HttpResponse子对象。
返回模板、返回文本和重定向上述示例都已说明,下面主要介绍子类JsonResponse和set_cookie方法
1.子类JsonResponse
- 返回json数据,一般用于异步请求
- 帮助用户创建JSON编码的响应
- JsonResponse的默认Content-Type为application/json
from django.http import JsonResponse
#json数据的响应
def response_json(request):
data=[
{'id': 101, 'name': 'aa', 'age': 20},
{'id': 102, 'name': 'bb', 'age': 23},
{'id': 103, 'name': 'cc', 'age': 25},
{'id': 104, 'name': 'dd', 'age': 27},
]
return JsonResponse({'data':data})
注:响应体中只支持字典类型的数据,因此要先将data列表封装成字典。
2.set_cookie方法
- Cookie 是由 Web 服务器保存在用户浏览器(客户端)上的小文本文件,它可以包含有关用户的信息。
- 服务器可以利用Cookies包含信息的任意性来筛选并经常性维护这些信息,以判断在HTTP传输中的状态。
- Cookies最典型的应用是判定注册用户是否已经登录网站
def cookie(request):
# 获取当前的 响应对象
response = HttpResponse('set_cookie方法')
# 使用响应对象进行cookie的设置
response.set_cookie('first_cookie', 'abc123')
# 返回响应对象
return response
HttpRequest对象
- 服务器接收到http协议的请求后,会根据报文创建HttpRequest对象
- 视图函数的第一个参数是HttpRequest对象
- 在django.http模块中定义了HttpRequest对象的API
属性(若无特别说明,则都是只读属性)
path:一个字符串,表示请求的页面的完整路径,不包含域名
method:一个字符串,表示请求使用的HTTP方法,常用值包括:'GET'、'POST'
encoding:一个字符串,表示提交的数据的编码方式(这个属性是可写的,可以通过修改它来修改访问表单数据使用的编码,如果为None,则使用默认设置utf-8)
GET:一个类似于字典的对象,包含get请求方式的所有参数
POST:一个类似于字典的对象,包含post请求方式的所有参数
FILES:一个类似于字典的对象,包含所有的上传文件
COOKIES:一个标准的Python字典,包含所有的cookie,键和值都为字符串
session:一个既可读又可写的类似于字典的对象,表示当前的会话,只有当Django 启用会话的支持时才可用,详细内容见“状态保持”
方法
is_ajax():
如果请求是通过XMLHttpRequest发起的,则返回True
QueryDict对象
- 定义在django.http.QueryDict
- request对象的属性GET、POST都是QueryDict类型的对象
- 与python字典不同,QueryDict类型的对象用来处理同一个键带有多个值的情况
- 方法get():根据键获取值
get方法只能获取键的一个值,如果一个键同时拥有多个值,获取最后一个值
dict.get('键',default),或dict['键']
- 方法getlist():根据键获取值
将键的值以列表返回,可以获取一个键的多个值
dict.getlist('键',default)