一:类视图

  1. 为什么使用类视图?

# 以注册请求逻辑为例

def register(request):

    if request.method == "GET":

        render(request, "register.html")

    if request.method == "POST":

        name = request.POST.get("name")

        age = request.POST.get("age")

        # 加入验证字段的逻辑

        # 存储数据库的逻辑

  上面的一段函数里面处理了两个逻辑,get逻辑和post逻辑,也能满足业务需求,那么我们为什么要使用类视图呢?

  使用类视图的好处:1.代码整洁,可读性强  2: 通过类的继承,直接可以使用类视图中的方法。

二:类视图使用的例子

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<form action="" method="POST">
     # 注意:id="username"导致,后端不能通过username的键取到输入的值。
姓名:<input type="text" name="username" placeholder="用户名">
密码:<input type="password" name="password" placeholder="密码">
<input type="submit"> </form>
</body>
</html>


from django.conf.urls import url
from .views import RegisterView urlpatterns = [
url(r"^register/", RegisterView.as_view()),
]
from django.http import JsonResponse
from django.shortcuts import render
from django.views.generic import View class RegisterView(View):
"""类是图处理注册""" def get(self,request):
"""处理get请求"""
return render(request, "./register.html") def post(self,request):
"""处理post请求"""
name = request.POST.get("username")
password = request.POST.get("password")
json_dict = {"name":name,"password":password} # 给前端返回一个json字符串内容
return JsonResponse(json_dict)
前端界面


三:装饰器在类视图中的应用

  使用场景:页面必须登录后才能访问,那么在进入类视图,调用get方法后,实现业务逻辑之前,先使用装饰器验证一下,用户是否已经登录。

from django.http import JsonResponse
from django.shortcuts import render
from django.views.generic import View
from django.utils.decorators import method_decorator def decoreate_login(func):
def inner(request,*args,**kwargs):
name = request.COOKIES.get("name")
if not name:
return JsonResponse({"error":"用户未登录"})
return func(request, *args,**kwargs)
return inner class RegisterView(View):
"""类是图处理注册"""
# 只是对类中的某一个方法进行了装饰,这是一种方式的装饰。
@method_decorator(decoreate_login)
def get(self,request):
"""处理get请求"""
return render(request, "./register.html") def post(self,request):
"""处理post请求"""
name = request.POST.get("username")
password = request.POST.get("password")
json_dict = {"name":name,"password":password}
return JsonResponse(json_dict)


from django.http import JsonResponse
from django.shortcuts import render
from django.views.generic import View
from django.utils.decorators import method_decorator def decoreate_login(func):
def inner(request,*args,**kwargs):
name = request.COOKIES.get("name")
if not name:
return JsonResponse({"error":"用户未登录"})
return func(request, *args,**kwargs)
return inner # 和上面的方式不一样,在类的外面进行装饰,name属性,指定装饰器的函数名字为get,效果都一样。
@method_decorator(decoreate_login,name="get")
class RegisterView(View):
"""类是图处理注册"""
def get(self,request):
"""处理get请求"""
return render(request, "./register.html") def post(self,request):
"""处理post请求"""
name = request.POST.get("username")
password = request.POST.get("password")
json_dict = {"name":name,"password":password}
return JsonResponse(json_dict)


  使用场景:禁止黑名单用户访问,例如禁止127.0.0.1的ip访问我们的视图。

from django.http import JsonResponse
from django.shortcuts import render
from django.views.generic import View
from django.utils.decorators import method_decorator def ban_ip(func):
def inner(request,*args,**kwargs):
ip = request.META.get("REMOTE_ADDR")
if ip in ["127.0.0.1","192.168.33.21"]:
return JsonResponse({"error":"此IP已经被封,封存时间为24小时"})
return func(request, *args,**kwargs)
return inner class RegisterView(View):
"""类是图处理注册"""
def get(self,request):
"""处理get请求"""
return render(request, "./register.html") @method_decorator(ban_ip)
def post(self,request):
"""处理post请求"""
name = request.POST.get("username")
password = request.POST.get("password")
json_dict = {"name":name,"password":password}
return JsonResponse(json_dict)

点击提交按钮后

最新文章

  1. Javascript中的valueOf与toString
  2. webservice总结
  3. flex polygon 序列化为txt 文本
  4. 上国际网络——通过配置host
  5. Python科学计算利器——Anaconda
  6. fastdfs-client-java 文件上传
  7. My97 DatePicker
  8. delphi用TAdoStoredProc调用存储过程,兼容sql2005、2008、2014的远程事务问题
  9. jsp 按钮颜色
  10. 编号中的数学_KEY
  11. [BZOJ4195] [NOI2015] 程序自动分析 (并查集)
  12. 使用+Leapms查看线性规划的单纯形表,itsme命令
  13. Git忽略规则及.gitignore规则不生效的解决办法(转)
  14. Keepalived+LVS高可用负载均衡集群
  15. Go-day06
  16. CSS 将一个页面平均分成四个部分(div)
  17. C# 修改编译版本的方法
  18. linux/centos6.5下编译安装python2.7和python3.5.2
  19. mpvue 使用echarts动态绘制图表(数据改变重新渲染图表)
  20. 关于swiper的tab(选项卡)中设置了autoHeight没有效果解决

热门文章

  1. React-Native 之 GD (十)Android启动页面 及 模态方式跳转
  2. SeaJS基本开发原则
  3. 测开之路九十五:css进阶之光标和溢出内容处理
  4. Spring MVC 向页面传值-Map、Model和ModelMap https://www.cnblogs.com/caoyc/p/5635878.html
  5. chapter2
  6. python基础-11 socket,IO多路复用,select伪造多线程,select读写分离。socketserver源码分析
  7. openWRT利用mac地址限制局域网内设备访问外网
  8. JavaSE编码试题强化练习3
  9. iBatis框架之配置文件之注意点之总结
  10. Buy Tickets POJ - 2828 思维+线段树