Django3.0
-----借鉴:cls超:地址点这里
CBV和FBV
FBV (function based view) 在视图里使用函数处理请求
def home(request): print('home!!!') return render(request,'home.html')
CBV (class based view) 在视图里使用类处理请求
- 提高了代码的复用性,可以使用面向对象的技术,比如Mixin(多继承)
- 可以用不同的函数针对不同的HTTP方法处理,而不是通过很多if判断,提高代码可读性
views.py
from django.views import View class LoginView(View): # 通过请求方法找到自己写的视图类里面对应的方法 def get(self,request): return render(request,'login2.html') def post(self,request): username = request.POST.get('uname') password = request.POST.get('pwd') print(username,password) return HttpResponse('登录成功!')
urls.py
url(r'^login2/', views.LoginView.as_view()),
CBV通过不同的请求方法找到对应的类中的方法(了解)
# 反射
def dispatch(self, request, *args, **kwargs): if request.method.lower() in self.http_method_names: handler = getattr(self, request.method.lower(), self.http_method_not_allowed)
CBV的dispatch方法
from django.views import View class LoginView(View): # GET def dispatch(self, request, *args, **kwargs): # 请求之前 ret = super().dispatch(request, *args, **kwargs) # 请求之后 return ret
def get(self,request): print('get方法执行了') return render(request,'login2.html')
def post(self,request): username = request.POST.get('uname') password = request.POST.get('pwd') print(username,password) return HttpResponse('登录成功!')
给视图加装饰器
使用装饰器装饰FBV
FBV本身就是一个函数 所以和给普通函数家装饰器没有区别:
def func(s1): def inner(*args,**kwargs): print('请求之前') ret = s1(*args,**kwargs) print('请求之后') return ret return inner @inner def home(request): print('home!!!') return render(request,'home.html')
使用装饰器装饰CBV
类的方式与独立函数不完全相同,因此不能直接将函数装饰齐全应用于类的方法,我们需要先将其转换为方法装饰器
Django体重了method_decorator装饰器用于将函数装饰器转换为方法装饰器
def adroner(func): def inner(*args,**kwargs): print("函数请求来了") ret = func(*args,**kwargs) print("函数请求结束") return ret return inner # @method_decorator(adroner,name="get") # 给get请求加装饰器 不常用 class LoginTest(View): # 这里继承View @method_decorator(adroner) # 给所有请求加装饰器 def dispatch(self, request, *args, **kwargs): # 请求之前 ret = super().dispatch(request, *args, **kwargs) # 请求之后 return ret @method_decorator(adroner) # 给get请求加装饰器 def get(self,request): return render(request,"login2.html") def post(self,request): username = request.POST.get("username") password = request.POST.get("password") print(username,"\n"+password) return HttpResponse("登录成功")
- 添加装饰器前必须导入from django.utils.decorators import method_decorator
- 添加装饰器的格式必须为@method_decorator(),括号里面为装饰器的函数名
- 给类添加是必须声明name
- 注意csrf-token装饰器的特殊性,在CBV模式下它只能加在dispatch上面(后面再说)
下面这是csrf_token的装饰器:
@csrf_protect,为当前函数强制设置防跨站请求伪造功能,即便settings中没有设置csrfToken全局中间件。
@csrf_exempt,取消当前函数防跨站请求伪造功能,即便settings中设置了全局中间件。
注意:from django.views.decorators.csrf import csrf_exempt,csrf_protect
请求相关的属性方法
暂时这样
def index(request): #http相关请求信息---封装--HttpRequest对象 if request.method == 'GET': print(request.body) #获取post请求提交过来的原始数据(b'username=dazhuang') print(request.GET) #获取GET请求提交的数据 # print(request.META) # 请求头相关信息,就是一个大字典 print(request.path) #/index/ 路径 print(request.path_info) #/index/ 路径 print(request.get_full_path()) #/index/?username=dazhuang&password=123 print(request.POST) #获取POST请求提交的数据
响应相关方法
暂时这样
HttpResponse --- 回复字符串的时候来使用 render --- 回复一个html页面的时候使用 redirect -- 重定向 示例:
from django.shortcuts import render,HttpResponse,redirect
def login(request): if request.method == 'GET': return render(request,'login.html') else: username = request.POST.get('username') password = request.POST.get('password') if username == 'taibai' and password == 'dsb': # return render(request,'home.html') return redirect('/home/') #重定向 else: return HttpResponse('登录成功!!!') #首页 def home(request): return render(request,'home.html')
扩展知识点
1)301和302的区别。 301和302状态码都表示重定向,就是说浏览器在拿到服务器返回的这个状态码后会自动跳转到一个新的URL地址,这个地址可以从响应的Location首部中获取 (用户看到的效果就是他输入的地址A瞬间变成了另一个地址B)——这是它们的共同点。 他们的不同在于。301表示旧地址A的资源已经被永久地移除了(这个资源不可访问了),搜索引擎在抓取新内容的同时也将旧的网址交换为重定向之后的网址; 302表示旧地址A的资源还在(仍然可以访问),这个重定向只是临时地从旧地址A跳转到地址B,搜索引擎会抓取新的内容而保存旧的网址。 SEO302好于301 2)重定向原因: (1)网站调整(如改变网页目录结构); (2)网页被移到一个新地址; (3)网页扩展名改变(如应用需要把.php改成.Html或.shtml)。 这种情况下,如果不做重定向,则用户收藏夹或搜索引擎数据库中旧地址只能让访问客户得到一个404页面错误信息,访问流量白白丧失;再者某些注册了多个域名的 网站,也需要通过重定向让访问这些域名的用户自动跳转到主站点等。
- 临时重定向(响应状态码:302)和永久重定向(响应状态码:301)对普通用户来说是没什么区别的,它主要面向的是搜索引擎的机器人