• 116.类视图添加装饰器


    之前说过为视图函数添加装饰器,同样我们也可以为类视图添加装饰器。比如,我们要实现在没有输入用户名username=xxx时,返回给用户登录的login页面,如果进行传入了?username=xxx,就可以进入个人中心页面,views.py文件中示例代码如下:
    from django.http import HttpResponse
    from django.views.generic import View
    from django.shutcuts import render, redirect, reverse
    from django.utils.decorators import method_decorator
    
    
    <!--推荐:可以直接在类视图上直接使用 method_decorator方法为类视图的dispatch方法添加装饰器,这种方法相对简单-->
    <!--并且在使用多个装饰器的时候,同样可以传递一个列表,列表中包含多个装饰器。-->
    
    @ method_decorator(login_required, name='dispatch')
    <!--name参数代表的是要在类视图的哪个函数上添加装饰器-->
    class Profile_view(View):
        
        def get(self, request):
            return HttpResponse('个人中心')
        
        <!--不推荐:可以直接在dispatch方法上添加装饰器,但是这样的话,相对来说比较麻烦,因为还得重写dispatch方法-->
        <!--@method_decorator(login_required)-->
        <!--def dispatch(request, *args, **kwargs):-->
        <!--    return super(Profile_view, self).dispatch(**kwargs)-->
        
    
    因为在服务器接收到客户端发送过来的GET或POST请求之后,并不会立即执行该请求的方法,而是首先执行dispatch()方法,判断该请求的方法,之后才会执行get()或者是post()方法,所以在执行dispatch()方法的时候我们就要为该方法添加一个装饰器,将没有输入username访问个人中心页面的所有请求都返回login页面。实现的示例代码如下,均是在以上代码的基础上进行添加:
    def login_required(fuc):
        def wrapper(request, *args, **kwargs):
            username = request.GET.get('username')
            if username:
                return fuc(request)
            else:
                return redirect(reverse('Profile:login'))
                
    def login(request):
        return HttpResponse('success')
    

    在app: Profile中的urls.py文件中进行视图函数与url的映射,示例代码如下:

    from django.urls import path
    from . import views
    from .views import Profile_view
    
    app_name = 'Profile'
    
    urlpatterns = [
        path('', Profile_view.as_view()),
        path('login/', views.login, name='login'),
    ]
    

    在项目的urls.py文件中再进行一层主url的映射,示例代码如下:

    from django.urls import path, include
    
    urlpatterns = [
        path('Profile/', include('Profile.urls')),
    ]
    
    始于才华,忠于颜值;每件事情在成功之前,看起来都是天方夜谭。一无所有,就是无所不能。
  • 相关阅读:
    MySQL字符串相加函数如何运行?似曾相识还是记一笔吧
    JQuery使用getJSON跨域调用数据
    匹配中文字符的正则表达式
    php中删除超链接的正则表达式
    win2003系统+IIS6下,经常出现w3wp.exe和sqlserver.exe的内存占用居高不下
    如何添加修改uchome创始人
    JS中Null与Undefined的区别
    错误分析及解决办法MySQL server has gone away
    更改表自动递增值的sql
    mysql如何修改导入数据库文件大小限制
  • 原文地址:https://www.cnblogs.com/guyan-2020/p/12306204.html
Copyright © 2020-2023  润新知