Djngo项目创建的准备工作【5】

news2024/11/15 10:59:29

【 一 】搭建纯净模式

核心就是 在安装完drf之后记得在app里面注册'rest_framework',

# django 默认很多app--》很多表
    auth 6个表
    session 表
    content-type表
# django很多中间件
​
# 以后我们的项目,可能不用这些东西---》由于带了内置app,这些表就会创建
​
# 后期如果项目的用户表,不用auth的user表,做成纯净环境
    -1 删除所有app
    -2 删除所有中间件
    -3 安装drf
    -4 配置:
        REST_FRAMEWORK = {
            "UNAUTHENTICATED_USER": None,
        }

  • 步骤 1: 创建新的Django项目和应用

首先,你需要使用Django的命令行工具来创建一个新的项目和应用。

# 创建一个新的Django项目  
django-admin startproject myproject  
  
# 进入项目目录  
cd myproject  
  
# 创建一个新的应用(比如 user_app)  
python manage.py startapp user_app
  • 步骤 2: 修改项目的settings.py

myproject/settings.py文件中,确保你的INSTALLED_APPS包含了你的新应用user_app。同时,将MIDDLEWARE列表设置为空(请注意,这在实际项目中是不推荐的):

# myproject/settings.py  
  
INSTALLED_APPS = [  
    # ...  
    'user_app',  
    # ...  
]  
  
MIDDLEWARE = []  # 注意:这在实际项目中是不推荐的
  • 步骤 3: 在user_app中创建views.py

user_app/views.py文件中,你可以编写一个简单的视图来渲染一个模板。首先,确保从django.shortcuts中导入了render函数。

# user_app/views.py  
  
from django.shortcuts import render  
  
def home(request):  
    # 这里可以添加一些逻辑来处理请求,但在这个例子中我们直接渲染模板  
    return render(request, 'home.html')
  • 步骤 4: 创建urls.py和home.html

user_app目录下,创建一个urls.py文件来定义你的URL模式。然后,在项目的urls.py中包含这个应用的URL配置。

# myproject/urls.py  
from django.contrib import admin  
from django.urls import include, path  
  
urlpatterns = [  
    path('admin/', admin.site.urls),  
    path('', include('user_app.urls')),  # 引入user_app的URL配置  
]  
  
# user_app/urls.py  
from django.urls import path  
from . import views  
  
urlpatterns = [  
    path('', views.home, name='home'),  
]

接着,在user_app/templates/user_app/目录下创建home.html模板文件(确保你的Django项目配置中的TEMPLATES'DIRS'设置包含了该模板目录的路径)。

<!-- user_app/templates/user_app/home.html -->  
<!DOCTYPE html>  
<html lang="en">  
<head>  
    <meta charset="UTF-8">  
    <title>Home Page</title>  
</head>  
<body>  
    <h1>Welcome to the Home Page!</h1>  
</body>  
</html>
  • 步骤 5: 运行开发服务器

最后,你可以运行Django的开发服务器来查看你的应用是否按预期工作。

# 在myproject目录下运行  
python manage.py runserver

【 二 】封装全局异常

  • isinstancetype的区别

  • isinstance()

    • isinstance() 是一个内建函数,用于判断一个对象是否是一个已知的类型(可以是直接或间接的)。

    • 它会检查对象的类型是否等于指定的类型,或者是否是从指定的类型继承而来的。

    • 使用 isinstance() 是推荐的做法,因为它考虑了类的继承关系。

    type()

    • type() 也是一个内建函数,它返回对象的类型。

    • 对于大多数内置类型,type() 返回的是对应的类型对象(如 intstrlist 等)。

    • 当涉及到类的继承时,type() 只返回对象的直接类型,而不会考虑它的超类。

    • 使用 type() 来比较类型时,它只会检查对象的直接类型,而不考虑继承。

  • 自定义的异常捕获在公共utils创建exception.py文件

​
from rest_framework.views import exception_handler as drf_exception_handler
from rest_framework.views import Response
from rest_framework import status
# 导入自定义日志
from .logg import logger
import logging
​
​
logging.getLogger('django')
# 以后可能会自定义自定义异常类
class NoPermissionException(Exception):
    pass # # 不需要额外的__init__方法,除非你需要额外的功能
​
​
​
def exception_handler(exc, context):
    # 记录日志
    # 只要执行到这,一定以为着程序出现了异常,记录日志
    resquest = context.get('request')
    user = resquest.user.id or '【 匿名用户 】'
    path = resquest.get_full_path()
    view = str(context.get('view'))
    ip = resquest.META.get("REMOTE_ADDR")
    error = str(exc)
    logger.error('用书:[%s],访问路径:[%s],视图类是:[%s],客户端地址:[%s],出差了,错误信息是:[%s]'
                 % (user, path, view, ip, error))  # 这就是基本规划
​
    res = drf_exception_handler(exc, context)
    # 我们将这些进行细分的区分异常 804 888 806 分别代表什么
​
    if res:
        # drf的异常 data=['错误1',错误2]    data={detail:'sss'}
        if isinstance(res.data, dict):
            err = res.data.get('detail')
        elif isinstance(res.data, list):
            err = res.data[0]
        else:
            err = '服务异常,请稍后再尝试,-drf'
        response = Response({'code': 999, 'msg': err})
    else:
        # 非drf异常,更细力度的区分异常
        if isinstance(exc, ZeroDivisionError):
            err = '数据操作出错,除以0了'
            code = 909
        elif isinstance(exc, NoPermissionException):
            err = f'您没有操作权限:{str(exc)}'
            code = 906
        else:
            err = f'系统错误:{str(exc)}'
            code = 909
        response = Response({'code': code, 'msg': err})
​
    return response
  • 配置文件新的dev.py

#  封装异常处理
REST_FRAMEWORK = {
    # 文件名.函数名
    'EXCEPTION_HANDLER': 'lufy.utils.exception.exception_handler',
}

  • 子路由user/urls.py

from django.urls import path
from . import views
from .views import LoggerView, ExceptionView
​
urlpatterns = [
    path('logg/', LoggerView.as_view(), name='home'),
    path('except/', ExceptionView.as_view()),
]
​

  • 子路由user/view.py

​
from rest_framework.response import Response
from rest_framework.views import APIView
# 日志
from lufy.utils.logg import logger
# 异常的包
from rest_framework.exceptions import ValidationError,AuthenticationFailed,APIException
# 自定义异常捕获
from lufy.utils.exception import NoPermissionException
​
class LoggerView(APIView):
    def get(self,request):
        logger.info('来了,老弟')
        return Response('ok')
​
​
class ExceptionView(APIView):
    def get(self,request):
        # drf异常
        # 主动抛出异常!!!
        # x = 1/0
        # print(x)
        # raise ZeroDivisionError('失败了这么棒!!。人生当苦无妨,良人当归便好。')
        # # {
        # #     "code": 909,
        # #     "msg": "数据操作出错,除以0了"
        # # }
​
        try:
            # 这里是你可能会出现除零错误的代码
            res = 1 / 0
        except ZeroDivisionError:
            # 捕获除零错误,并抛出 NoPermissionException 异常
            raise NoPermissionException('4564') # 这个就是自定义的报错
            
            # {     
            #     "code": 906,
            #     "msg": "您没有操作权限:4564"
            # }
​
        return Response('ok')
​

image-20240510162645359

image-20240510162855878

  • 以后视图类的方法可以写成

# 后期视图的方法,可以写成这种模板
try:
    # 核心逻辑
    if 某个条件不符合:  # 或断言
        raise NoPermissionException
    except NoPermissionException as e:
        # return Response({'code':888,'msg':'错误'})
        raise NoPermissionException('没有权限')
    except AAException as e:
        raise NoPermissionException('没有权限')
        return Response('ok')

【 三 】二次封装Response模块

  • Response这个就是前端我们看到的数据

# 响应---》drf提供的Response---》前端想接收到的格式
    {code:xx,msg:xx}

image-20240510163852988

# 写一个响应类,实现
'''
    -APIResponse()--->{code:100,msg:成功}
    -APIResponse(code=101,msg='失败')--->{code:101,msg:失败}
    -APIResponse(username=lqz,token:adsfa.as.ss,icon:头像地址)--->{code:100,msg:成功,username:lqz,token:adsfa.as.ss,icon:头像地址}
    
    -APIResponse(results=[{},{}])--->{code:100,msg:成功,results=[{},{}]}
   
    -APIResponse(headers={})--->{code:100,msg:成功,results=[{},{}]}    '''
  • 开始封装

  • code=100, msg='成功响应!!!': 这是APIResponse类的默认参数,表示当没有提供其他参数时,响应将包含一个状态码100和一条消息'成功响应!!!'

  • if kwargs:: 这检查是否有传入任何额外的关键字参数(即除了codemsgstatustemplate_nameheaders之外的参数)。

  • data.update(kwargs): 如果存在额外的关键字参数,它们将被添加到data字典中。这样,你可以通过传递额外的关键字参数来向响应中添加任意数量的字段。

  • super().__init__(data=data, status=status, headers=headers): 这调用父类(即原始的Response类)的__init__方法,并传入你已经准备好的datastatusheaders参数。这样,你就可以确保父类的所有功能仍然可用,并且你的APIResponse类将作为一个完整的、可工作的响应对象。

  • 在lufy/utils/utils_Response.py

from rest_framework.response import Response
​
​
class APIResponse(Response):
    '''
    源码里面的数据
        def __init__(self, data=None, status=None,
                 template_name=None, headers=None,
                 exception=False, content_type=None):
​
    我们就是要先重写Response里面的__init__
    '''
​
    def __init__(self, code=100, msg='成功响应!!!', status=None, template_name=None, headers=None, **kwargs):
        data = {'code': code, 'msg': msg}
        if kwargs:
            data.update(kwargs)
        super().__init__(data=data, status=status, headers=headers)
  • 子路由user/urls.py

from django.urls import path
from . import views
from .views import LoggerView, ExceptionView,ResponseView
​
urlpatterns = [
    # 日志
    path('logg/', LoggerView.as_view(), name='home'),
    # 异常
    path('excet/', ExceptionView.as_view()),
    # 响应方法
    path('ponse/', ResponseView.as_view()),
]
  • 子路由user/view.py

from lufy.utils.utils_response import APIResponse
​
class ResponseView(APIView):
    def get(self, request, *args, **kwargs):
        # return APIResponse(name="shazi",password='123123132',token='asdas.da.dasd')
        # return APIResponse(results=[{"user":'132'},{"hobby":['music','running']}])
        return APIResponse(headers={"hobby":['music','running']})

image-20240510165941190

---------------------------------------------------------------------------------------------------------------------------------------

image-20240511164706708

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1920576.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

MaxViT : 多轴Vision Transformer

本文提出了一种高效、可扩展的多轴注意力模型,该模型包括两个方面:局部注意力被阻塞和全局注意力被扩张。这些设计选择允许在任意输入分辨率下的全局-局部空间交互,只有线性复杂度。还通过有效地将注意力模型与卷积混合在一起,提出了一个新的架构元素,并相应地提出了一个简…

IAR全面支持芯驰科技E3系列车规MCU产品E3119/E3118

中国上海&#xff0c;2024年7月11日 — 全球领先的嵌入式系统开发软件解决方案供应商IAR与全场景智能车芯引领者芯驰科技宣布进一步扩大合作&#xff0c;最新版IAR Embedded Workbench for Arm已全面支持芯驰科技的E3119/E3118车规级MCU产品。IAR与芯驰科技有着悠久的合作历史&…

强化学习实战3:Sarsa 与 Q-Learning 算法求解迷宫问题

前置知识 首先实验环境依然是我们之前说的迷宫环境&#xff0c;然后是一些基本术语&#xff0c;应该都是比较熟悉的&#xff1a; 强化学习的算法大概有两类&#xff0c;一类是策略迭代&#xff08;讲究的是策略 Π &#xff09;&#xff0c;还有一类是价值迭代&#xff0c;也就…

电脑 DNS 缓存是什么?如何清除?

DNS&#xff08;Domain Name System&#xff0c;域名系统&#xff09;是互联网的重要组成部分&#xff0c;负责将人类易记的域名转换为机器可读的 IP 地址&#xff0c;从而实现网络通信。DNS 缓存是 DNS 系统中的一个关键机制&#xff0c;通过临时存储已解析的域名信息&#xf…

lnmp+DISCUZ+WORDPRESS

lnmpDISCUZWORDPRESS lnmpDISCUZ&#xff08;论坛的一个服务&#xff09; l&#xff1a;linux操作系统 n&#xff1a;nginx前端页面的web服务 php&#xff1a;动态请求转发的中间件 mysql&#xff1a;数据库 保存用户和密码以及论坛的相关内容 mysql8.0.30安装&#xff1a…

微信综合购物商城小程序ui模板源码

微信电商小程序前端页面&#xff0c;综合购物商城ui界面模板。主要功能包含&#xff1a;电商主页、商品分类、购物车、购物车结算、我的个人中心管理、礼券、签到、新人专享、专栏、商品详情页、我的订单、我的余额、我的积分、我的收藏、我的地址、我的礼券等。这是一款非常齐…

单相整流-TI视频课笔记

目录 1、单相半波整流 1.1、单相半波----电容滤波---超轻负载 1.2、单相半波----电容滤波---轻负载 1.3、单相半波----电容滤波---重负载 2、全波整流 2.1、全波整流的仿真 2.2、半波与全波滤波的对比 3、全桥整流电路 3.1、全波和全桥整流对比 3.2、半波全波和全桥…

【Linux杂货铺】2.进程优先级

1.进程优先级基本概念 进程优先级是操作系统中用于确定进程调度顺序的一个指标。每个进程都会被分配一个优先级&#xff0c;优先级较高的进程会在调度时优先被执行。进程优先级的设定通常根据进程的重要性、紧急程度、资源需求等因素来确定。操作系统会根据进程的优先级来决定进…

出现 failed to remove xxxx: Invalid argument 解决方法

目录 前言1. 问题所示2. 原理分析3. 解决方法 前言 这好像是一个Git的一个Bug&#xff0c;对应有个下下策的解决方式 1. 问题所示 Git提交的时候出现如下问题 Git warning:failed to remove debug.log:invalid argumentgit clean -f -1 --F&#xff1a;\xxx failed to rem…

准备工作+1、请求和响应+2、模型和管理站点

Django快速入门——创建一个基本的投票应用程序 准备工作1、创建虚拟环境2、安装django 1、请求和响应&#xff08;1&#xff09;创建项目&#xff08;2&#xff09;用于开发的简易服务器&#xff08;3&#xff09;创建投票应用&#xff08;4&#xff09;编写第一个视图1、编写…

Python(四)---序列

文章目录 前言1.列表1.1.列表简介1.2.列表的创建1.2.1.基本方式[]1.2.2.list()方法1.2.3.range()创建整数列表1.2.4.推导式生成列表 1.3. 列表各种函数的使用1.3.1.增加元素1.3.2.删除元素1.3.3.元素的访问和计数1.3.4.切片1.3.5.列表的排序 1.4.二维列表 2.元组2.1.元组的简介…

mybatis基础语法

Mybatis快速入门 1.需求 使用MyBatis查询所有的用户, 封装到List集合 2.分析 创建maven工程&#xff08;jar&#xff09;&#xff0c;添加坐标创建pojo创建UserDao接口创建UserDao映射文件创建Mybatis核心配置文件SqlMapConfig.xml编写java代码测试 3.实现 准备工作&…

《梦醒蝶飞:释放Excel函数与公式的力量》11.3 ISTEXT函数

第11章&#xff1a;信息函数 第三节 11.3 ISTEXT函数 11.3.1 简介 ISTEXT函数是Excel中的一个信息函数&#xff0c;用于检查指定单元格中的内容是否为文本。如果单元格内容是文本&#xff0c;则返回TRUE&#xff1b;否则返回FALSE。ISTEXT函数在数据验证、条件格式化和逻辑判…

【排序算法】插入排序(希尔排序)

目录 一.直接插入排序 1.基本思想 2.实现 3.特性 1.效率 2.时间复杂度&#xff1a;O(N^2) 3.空间复杂度&#xff1a;O(1) 4.稳定性&#xff1a;稳定 二.希尔排序 1.基本思想 2.实现 3.特性 1.效率 2.时间复杂度&#xff1a;O(N^1.3) ​编辑 3.空间复杂度&#xff…

AI在软件开发中的角色:辅助创新还是自动化取代?

文章目录 每日一句正能量前言&#xff1a;人工智能与软件开发的未来交汇点AI工具现状AI对开发者的影响工作方式的改变需要掌握的新技能保持竞争力的策略结论 AI开发的未来AI在软件开发领域的未来发展方向AI是否可能完全取代开发者如何在AI时代规划开发者的职业发展结论 后记&am…

【通过pnpm创建vite项目】

vue3最新项目技术构建后台管理系统 一、技术要求二、安装pnpm2.1 构建vite三、项目配置3.1 eslint 配置3.2 prettier配置3.3 stylelint配置3.4 配置husky3.5 配置commitlint3.6 pnpm 强制安装四、Element-plus 引入4.1 完整引入4.2 国际化配置4.3 配置别名4.4 Env环境配置4.5 s…

教育与社会的发展

生产力与教育的关系 政治经济制度与教育的关系 文化和人口与教育的关系

《梦醒蝶飞:释放Excel函数与公式的力量》11.4 ISERROR函数

第11章&#xff1a;信息函数 第四节 11.4 ISERROR函数 11.4.1 简介 ISERROR函数是Excel中的一个信息函数&#xff0c;用于检查指定单元格或表达式是否产生错误。如果单元格或表达式产生任何类型的错误&#xff08;如N/A、VALUE!、REF!等&#xff09;&#xff0c;则返回TRUE&…

子任务:IT运维的精细化管理之道

在当今的企业运营中&#xff0c;信息技术已成为支撑业务发展的核心力量。根据Gartner的报告&#xff0c;IT服务管理&#xff08;ITSM&#xff09;的有效实施可以显著提升企业的运营效率&#xff0c;降低成本高达15%&#xff0c;同时提高服务交付速度和质量。随着业务的复杂性和…

Python中对asyncio的实际使用

前言&#xff1a;一般涉及异步编程我都无脑用celery&#xff0c;但是最近在做一个项目&#xff0c;项目不大&#xff0c;也不涉及定时任务&#xff0c;所以就用了asyncio。 asyncio是python自带的模块&#xff0c;比celery轻量&#xff0c;使用起来也简单。以前学习过&#xf…