Django视图层
一、视图函数
一个视图函数,简称视图,它是一个python函数,接受web请求并且返回web响应,响应可以是html文件、重定向、错误、图片等 ......。
视图层中有两个重要对象:请求对象(request)和响应对象(HttpResponse)。
请求对象
请求对象(HttpRequest):Django把http请求报文中的内容主体分装到了HttpRequest对象中,并把这个对象当做参数传递给了视图函数中的第一个参数,一般这个参数我们都定义成request。
请求对象的常用属性和方法:
- .method:——获取请求使用的方法(GET/POST)
- .GET:————获取get请求提交的数据
- .POST:———获取post请求提交的数据
- .META:———获取请求头相关信息
- .body:———byte类型,request.POST 的数据就是从body里提取的
- .path:——获取url地址的路径部分,只包含路径部分
- .path_info:——获取url地址的完整路径,既包含路径又包含参数部分
- .FILES:——类似于字典对象,包含所有的上传文件信息(post提交)。
- .get_full_path( ):——返回用户访问的URL包括get请求参数
- .is_secure( ):——判断请求是否通过 HTTPS 发起的。是则返回True
- .is_ajax( ):——如果请求是通过XMLHttpRequest 发起的,则返回True
# views.py文件 from django.shortcuts import render, reverse, HttpResponse def index(request): # http相关请求信息会传递给——>request if request.method == 'GET': print(request.GET) # 获取GET请求提交的数据 print(request.META) # 请求头相关信息,就是一个大字典 print(request.path) # /index/ 路径 print(request.path_info)# /index/ 路径 print(request.get_full_path()) # /index/?user=xiaoyang return render(request,'index.html') else: print(request.body) # post请求的原始数据 b'user=xiaoyang' print(request.POST) # 获取POST提交的数据
响应对象
Django最后一定会响应一个HttpResponse的示例对象
三种形式:
-
HttpResponse( ' 字符串 ' )——> 最简单
-
render( ‘ 页面 ’ )——> 最重要
-
两个功能
-
redirect():——> 重定向
—— 读取文件字符串
—— 嵌入变量(模板渲染)html里面
重定向状态码301和302的区别
-
相同之处:
301和302都表示重定向,会自动跳转到一个新的URL地址。
-
不同之处
301表示旧地址的资源已经被永久移除了,就是这个资源不可访问了。
302表示旧地址还存在,这个资源任然可以访问,这个重定向只是临时的转到另一个URL地址
重定向的原因:
- 调整网站(如改变网页目录结构)
- 网页被迁移到一个新的地址
- 网页扩展名改变(如应用需要把.php改成.html或.shtml)
HttpResponse ——> 回复字符串的时候使用
redirct ——> 重定向
def login(request): ... return redirect('/index/')
render ——> 回复一个HTML页面的时候使用
render(request, template_name[, context]) 参数: 1、request:用于生成响应的请求对象,固定必须传入的第一个参数 2、template_name:要使用的模板的完整名称,必须传入,render默认会去templates目录下查找模板文件 3、context:可选参数,可以传入一个字典用来替换模块文件中的变量 render的功能可以总结为:根据给定字典渲染模板文件,并返回一个渲染后的 HttpResponse对象。
实例:
# views.py文件 from django.shortcuts import render, redirect, HttpResponse def login(request): # 当为GET请求时就返回登录页面 if request.method == 'GET': return render(request, 'login.html') else: # post 请求时,就提取出请求数据。 user = request.POST.get('username') pwd = request.POST.get('password') if user == 'xiaoyang' and pwd == '123': # 重定向到/index/路径 return redirect(/index/) else: return HttpResponse('登录失败') def index(request): return HttpResponse('登录成功!!!')
二、FBV和CBV
Django的视图层是由两种形式构成的:FBV和CBV
FBV
之前写的就是 FBV基于函数的视图(Function Base View)
# views.py文件 from django.shortcuts import render def index(request): return render(request, 'index.html')
FBV加装饰器
FBV本身就是一个函数,所以和普通函数加装饰器一样。
# views.py文件 from django.shortcuts import render, HttpResponse def wapper(func): def inner(*args, **kwargs): print('请求之前') ret = func(*args, **kwargs) print('请求之后') return ret return inner @wapper def login(request): return render(request, 'login.html')
CBV
CBV基于类的视图(Class Base View)
实例:
# urls.py文件 from django.urls import path, re_path from app01 import views urlpatterns = [ # 必须调用类中的as_view()方法 re_path(r'^login/', views.Login_View.as_view()) ] # ------------------------------------------------------ # views.py文件 from django.shortcuts import render, HttpResponse from django.views import View # 需要手动导入 class Login_View(View): # 必须继承View类 # 当请求url为:http://127.0.0.1:8000/login/会先触发dispatch的执行 def dispatch(self, request, *args, **kwargs): 1f13 """ 请求前的预处理操作 """ # 必须执行父类的dispatch方法 obj = super().dispatch(request, *args, **kwargs) """ 请求后的操作 """ return obj # 必须返回obj # get请求对应的操作 def get(self, request): return render(request, 'login.html') # post请求对应的操作 def post(self, request): user = request.POST.get('user') pwd = request.POST.get('pwd') if user == 'xiaoyang' and pwd == '123': return HttpResponse('登录成功!!!') else: return HttpResponse('登录失败!!!')
CBV加装饰器
在CBV中加装饰器不能直接将函数装饰器应用于类中的方法,因为类中的方法和独立函数完全不相同,因此我们需要先将其转换为方法装饰器。
Django提供了 method_decorator 装饰器用于将函数装饰器转换为方法装饰器。
实例:
方式一:装饰在get方法上面
# views.py文件 from django.shortcuts import render, HttpResponse # 需要手动导入 from django.utils.decorators import method_decorator from django.views import View def wapper(func): def inner(*args, **kwargs): print('请求之前') ret = func(*args, **kwargs) print('请求之后') return ret return inner class Login_View(View): # 将装饰器写入括号内 @method_decorator(wapper) def get(self, request): return render(request, 'login.html') def post(self, request): return HttpResponse('post方法...')
方法二:给所有的方法加装饰器
这个是装饰在父类的dispatch方法上面,所以它先执行装饰器函数,然后调用了父类的dispatch类属性,最后才执行的我我们的类方法
实例:
# views.py文件 from django.shortcuts import render, HttpResponse # 需要手动导入 from django.utils.decorators import method_decorator from django.views import View def wapper(func): def inner(*args, **kwargs): print('请求之前') ret = func(*args, **kwargs) print('请求之后') return ret return inner class Login_View(View): @method_decorator(wapper) # 装饰在dispatch上面 def dispatch(self, request, *args, **kwargs): obj = super().dispatch(*args, **kwargs) return obj def get(self, request): return render(request, 'login.html') def post(self, request): return HttpResponse('post方法...')
方式三:装饰在class上可以通过属性名指定要装饰的方法
这个装饰的是指定的方法,所以先调用了父类的dispatch方法执行装饰函数。
# views.py文件 from django.utils.decorators import method_decorator from django.views import View def wapper(func): def inner(*args, **kwargs): print('请求之前') ret = func(*args, **kwargs) print('请求之后') return ret return inner @method_decorator(wapper,name='get') class Login_View(View): def get(self): pass def post(self): pass
- Django入门-6:视图(URLconf使用)
- [Dynamic Language] Python Django: 模板引擎(4)在视图中使用模板和模板继承
- Django框架提升(2)~视图
- django 中的视图(Views)
- Django视图扩展类知识点详解
- 认识django2.0读书笔记(3)---第三章 视图和URL配置
- Django view(视图)
- Django 基于类的视图源码分析 三
- Django视图之ORM数据库查询操作API
- Django框架中的对象列表视图使用示例
- Django基础:drf 源码视图解析
- Django_study_day14:视图类03
- Django 博客首页视图
- Django -- 视图和URL配置
- Django 1.6 基于类的通用视图
- Django视图
- DRF(Django REST Framework)中的类视图
- Django中的类视图与函数视图之间的区别
- Django初建最简单的项目目录及视图
- Django之view视图处理(FBV,CBV,装饰器,前后端交互各种数据类型和响应,请求头相关信息)【交互篇二】