首页 > 其他分享 >Django在类中使用装饰器

Django在类中使用装饰器

时间:2023-04-14 09:55:43浏览次数:33  
标签:status request Django print session user 使用 id 装饰

类的视图函数中使用装饰器

场景描述

前后端分离项目 后端暴露接口 前端调用
一个接口根据不同的请求方式处理不同的内容
比如我有一个/user接口:
get:返回成员信息
post:添加信息
put:修改信息
delete:删除信息
在每个请求中都需要判断凭证,也就是请求头中的某个字段,来鉴别用户身份,
如果每个请求中都写同样的逻辑,很繁琐,因此我们可以考虑使用装饰器

如果直接在类外面写个函数,再处理逻辑,好像访问不到request对象,因此我们可以使用django自带的工具库,method_decorator

代码示例

import json

from django.http import JsonResponse
from django.views import View
from django.contrib.sessions.models import Session
from .models import Admin
from datetime import datetime, timedelta
from django.utils.decorators import method_decorator


# 自定义装饰器
def check_session_id(func):
    def wrapper(request, *args, **kwargs):
        try:
            print('进入了装饰器')
            print(request.headers)
            session_id = request.headers.get('Authorization',False).split(' ')[1]
            except (AttributeError, IndexError):
            # except (AttributeError, IndexError):
            print('捕获到了异常')
            return JsonResponse({'status': 'error', 'msg': '请先登录'}, status=401)
        if session_id is not None:
            try:
                print('sessionid不为空')
                session = Session.objects.get(session_key=session_id)
            except Session.DoesNotExist:
                session = None
                # 如果通过当前sessionid可以获取到数据
            if session is not None:
                user_data = session.get_decoded()
                # print(f'当前用户:{user_data.username},角色:{user_data.role}')
                print(user_data['info'])
                return func(request, *args, **kwargs)
            else:
                return JsonResponse({'status': 'error', 'msg': "非法访问"}, status=401)
        else:
            return JsonResponse({'status': 'error'}, status=401)

    return wrapper


class AdminInfo(View):

    # 获取当前所有员工以及admin信息
    @method_decorator(check_session_id)
    def get(self, request):
        print('进入了get请求')
        user_list = []
        users = Admin.objects.all()
        for user in users:
            obj = {}
            obj['name'] = user.name
            obj['password'] = user.password
            obj['role'] = user.role
            user_list.append(obj)
        return JsonResponse({'status': 'success', 'data': user_list}, status=200)

    @check_session_id
    def post(self, request):
        pass

    @check_session_id
    def put(self, request):
        pass

    @check_session_id
    def delete(self, request):
        pass

标签:status,request,Django,print,session,user,使用,id,装饰
From: https://www.cnblogs.com/zx529/p/17317358.html

相关文章

  • 界面控件DevExtreme使用指南 - 折叠组件快速入门(一)
    DevExtreme拥有高性能的HTML5/JavaScript小部件集合,使您可以利用现代Web开发堆栈(包括React,Angular,ASP.NETCore,jQuery,Knockout等)构建交互式的Web应用程序,该套件附带功能齐全的数据网格、交互式图表小部件、数据编辑器等。请注意:在开始本教程之前,请确保DevExtreme已安装在Angula......
  • Django入门学习
    Django是一个开放源代码的web应用框架,由python编写,采用了MVT软件设计模式,即模型(Model)、视图(View)和模板(Template)。一、Django版本对应python版本Django版本Python版本3.23.6,3.7,3.8,3.9,3.10(在3.2.9中就已经加入了)4.03.8,3.9,3.104.13.8,3.9,3.10,3......
  • wpf使用propertygrid控件
    1.首先在引用里右键管理NuGet程序包查找extendedwpftoolkit并安装2.    引用DLL  xmlns:extoolkit="http://schemas.xceed.com/wpf/xaml/toolkit"3.<extoolkit:PropertyGridName="PropertyGrid1"Margin="0,45,-0.333,-0.333"></extoolkit......
  • django admin 使用SimpleUI自定义按钮弹窗框示例
    actions=['button_exeScript',]defbutton_exeScript(self,request,queryset):passbutton_exeScript.layer={#弹出层中的输入框配置#这里指定对话框的标题'title':'弹出层输入框',#提示信息......
  • WPF 使用依赖注入
    修改App.xaml.cs重新OnStartup和OnExit方法并使用Host启动解析appsettings.json配置文件在App.xaml中删除StartUri属性,否则会启动多个MainWindow包引用信息如下:Microsoft.Extensions.ConfigurationMicrosoft.Extensions.Configuration.JsonMicrosoft.Extensions.Depende......
  • 使用java.util.zip对生成的字节数组输出文件流 进行打包压缩(单个、批量),并返回压缩包
    废话不多说直接上代码 packagegov.test.util;importjava.io.ByteArrayInputStream;importjava.io.ByteArrayOutputStream;importjava.io.IOException;importjava.util.List;importjava.util.Map;importorg.apache.tools.zip.ZipEntry;importorg.apache.tools.zip.Zip......
  • wpf使用winform控件
    一、添加引用WindowsFormsIntegration.dll(负责整合WPF和Windows)System.Windows.Forms.dll(WinForm自带的控件库)提示:这两个引用都是在程序集中可以直接找到的ControlLib_k.dll(自定义的控件库)二、在要使用WinForm控件的WPF窗体的XAML文件中添加如下内容:xmlns是XML_Namespac......
  • RKMEDIA--VI的使用
    在上一篇文章RKMEDIA使用简介中简单的介绍了rkmedia的组成部分,本章主要聊聊VI模块。rkmedia中的VI模块主要可以从两个方式获取流:直接打开video节点的方式、使用rk平台的rkaiq。1、直接打开video节点的方式顾名思义只需要在vi初始化中配置VI_CHN_ATTR_S参数中pcVideoNode成对应......
  • Linux中使用ntpdate同步失败报错:14 Apr 08:42:12 ntpdate[1255]: the NTP socket is i
    报错信息: 报错原因:1、可能是因为同步的域名信息没有解析到。2、可能是因为服务的问题导致没有同步成功。 解决方法:1、先关闭ntpd服务。[root@k8s-master01~]#servicentpdstopRedirectingto/bin/systemctlstopntpd.service 2、重新同步。[root@k8s-maste......
  • #yyds干货盘点#【愚公系列】2023年04月 .NET CORE工具案例-.NET Core使用PaddleOCRSha
    (文章目录)前言PaddleOCRSharp是一个基于百度飞桨PaddleOCR的C++代码修改并封装的.NET的OCR工具类库。包含文本识别、文本检测、基于文本检测结果的统计分析的表格识别功能,同时针对小图识别不准的情况下,做了优化,提高识别准确率。包含总模型仅8.6M的超轻量级中文OCR,单模型支持中......