zoukankan      html  css  js  c++  java
  • django之类视图

    一:类视图

      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)

    点击提交按钮后
  • 相关阅读:
    Linux 学习 step by step (2)
    公共建筑能耗监测平台的GPRS通讯服务器的开发方法分享
    幸福框架:可扩展的、动态的、万能的 编号生成器
    C++ Data Member内存布局
    .NET程序集强命名删除与再签名技术 源代码剖析
    hdu 2191(多重背包)
    五种情况下会刷新控件状态(刷新所有子FWinControls的显示)——从DFM读取数据时、新增加子控件时、重新创建当前控件的句柄时、设置父控件时、显示状态被改变时
    终于懂了:Delphi消息的Result域出现的原因——要代替回调函数的返回值!(MakeObjectInstance不会帮助处理(接收)消息回调函数的返回值)
    Firemonkey实现Mac OS程序中内嵌浏览器的功能(自己动手翻译,调用苹果提供的webkit框架)
    感悟:市场经济看得就是主观能动性,有则富贵可及,无则无限趋于零
  • 原文地址:https://www.cnblogs.com/meloncodezhang/p/11760563.html
Copyright © 2011-2022 走看看