django:自定义响应404以及django项目下URL设置的导包问题

django:自定义响应404以及django项目下URL设置的导包问题

1 在django项目下的settings配置文件里将debug改为false(如果为true,在url.py中添加handler404不会生效,还是会展示原本的django的404页面)
在这里插入图片描述
2 新建文件夹commonPage,在文件夹下的commonStatus中导入我们自定义的status状态分别响应的信息(常见如401、404、500等等)
在这里插入图片描述
3 导入JsonResponse类,设置404
查看JsonResponse源码,本质上还是继承的HttpResponse类:
在这里插入图片描述
在这里插入图片描述
可知,实例化JsonResponse对象时,传入的第一个参数就是data(一般返回json格式数据,所以一般选择传入一个字典数据),对于data使用json.dumps将字典转为了json字符串(django的HttpResponse缺少了这个步骤),然后可以传入多余的key=value参数,会被kwargs接受为字典形式的数据,如下:
在这里插入图片描述
status=404这一步是必须的,会传入super().init(content=data, **kwargs)的参数kwargs中(在HttpResponse类中,决定请求的http响应状态的参数就是status参数,因为JsonResponse本质上是继承HttpResponse类,这里是调用了父类的构造函数),如果不传参status=404,默认的http响应状态码会是200

再在项目的URl配置文件下导入:
在这里插入图片描述
重启django项目,调用接口查看:
在这里插入图片描述
查看,响应http状态码为404,符合预期:
在这里插入图片描述
在这里插入图片描述

注意:在URL配置文件中导包时,使用的是python导包中的绝对导入,即:
from commonPage import commonStatus(具体路径,不包含.或者…这样的)
观察目录结构:
在这里插入图片描述

可知autoTest(包)和commonPage(文件夹)是同一级的,本来在python中,相对导入写法如下:
from . import module_name 导入和本py文件在同一目录下的模块。
from .package_name import module_name 导入和本py文件在同一目录下的包的模块。
from . . import module_name 导入上级目录的模块。
from . . package_name import module_name 导入位于上级目录下的包的模块。
所以这里本可以写为如下(语法提示也没错了):
在这里插入图片描述
但是执行manage.py的runserver命令却报错(尝试在顶级包之外进行相对导入):
在这里插入图片描述
因为,在python中,import导包,如果是运行的入口文件(即这个py文件作为入口,导入其它路径下的模块),那么可以使用绝对导入,但是如果是相对导入,执行的命令有变化。python3中,绝对导入的格式为 import A 或 from A import B,相对导入格式为 from . import B 或 from . . A import B,.代表当前模块,. .代表上层模块,…代表上上层模块,依次类推。如下理解:
同一目录下,新建入口文件x1.py,另1文件x2.py,
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
再在pythonPractice目录下,新建文件夹xx,放入x3.py,x4.py:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
报错是因为相对导入,这个.导致父包名未知。如果是非运行入口文件(上面的x1.py是运行入口文件,使用绝对导入),则需要相对导入(或者绝对导入 from xx import x4)。
修改如下,x3绝对导入x4(必须是from xx import x4,不能是import x4),然后x1绝对导入,执行没问题:

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
将x3改为相对导入,依然没问题:
在这里插入图片描述
在这里插入图片描述
但是如果x3是直接import x4,就会报错(虽然此时x3和x4在同一目录下,但是,不是在同一根目录下pythonPractice下,如果cd进入pythonPractice\xx目录下,执行python x3.py是没有问题的):
在这里插入图片描述

可见,同一根目录下(因为我们是在D:\pythonPractice目录下执行python xxx.py命令,所以对于D:\pythonPractice目录中的x1.py和x2.py就可以使用import 语句,同一根目录下的文件夹(如xx),就可以使用绝对导入from xx import x3,或者相对导入form . import x3),入口文件x1.py直接使用import,在这种情况下,Python会在两个地方寻找这个模块,1是sys.path(运行代码import sys; print(sys.path)查看);2是运行文件(这里是x1.py)所在的目录

注意:相对导入是基于当前模块的名称进行导入的。由于主模块的名称总是 "_ _ main_ _ " ,因此用作Python应用程序主模块的模块必须始终使用绝对导入。一言一概之,主模块内需使用绝对导入,不可以使用相对导入.

在这里插入图片描述
在这里插入图片描述
因为我们启动django的命令在autoTest目录下,所以manage.py就是入口文件,本质上会执行autoTest下的settings.py,而autoTest下的urls.py就相当于上面的x1.py,commonPage也是和autoTest平级的,他们之间的导包,需要使用绝对导入(from A import B)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值