Django相关

一、Django

django-框架模式

django采用的MTV的框架。

  • M 代表模型(Model): 负责业务对象和数据库的关系映射(ORM)。
  • T 代表模板 (Template):负责如何把页面展示给用户(html)。
  • V 代表视图(View): 负责业务逻辑,并在适当时候调用Model和Template。

除了上面的三层之外,还有一个url分发器。

django-请求生命周期

1、uWSGI服务器通过wsgi协议,将HttpRequest交给web框架 (Flask、Django)

2、首先到达request中间件,对请求对象进行校验或添加数据,例如:csrf、request.session,如果验证不通过直接跳转到response中间件

3、通过URL配置文件找到urls.py文件

4、根据浏览器发送的URL,通过视图中间件去匹配不同的视图函数或视图类,如果没有找到相对应的视图函数,就直接跳转到response中间件

5、在视图函数或视图类中进行业务逻辑处理,处理完返回到response中间件

6、模型类通过ORM获取数据库数据,并返回序列化json或渲染好的Template到response中间件

7、所有最后离开的响应都会到达response中间件,对响应的数据进行处理,返回HttpResponse给wsgi

8、wsgi经过uWSGI服务器,将响应的内容发送给浏览器。

django-中间件

中间件是一个处于uWSGI服务器和django视图之间的框架级的钩子函数,用来处理request和response。在全局上改变django的输入和输出,django内置了一些中间件,比如处理csrf攻击的,判断session的。

比较常用的中间件方法。

1 process_request(request对象) ,处理请求进来的时候,可以做限频,登录认证,访问日志等等

2 process_response(request对象,response对象) ,统一给出去的某些请求加上cookies或者响应头

3 process_view ,路由匹配成功且视图函数执行前,在这可以实现改变视图函数的触发时机,且可以在视图执行前后加代码,实现装饰器的功能

4 process_exception,全局异常捕获。

django-读写分离

django框架支持连接多个数据库,在配置文件里,我们可以配置多个数据库的连接。比如db1,db2,db3,分别连上三台机器的数据库。然后我们在使用的时候,可以手动读写分离或者自动。

如果是手动的话,就是在写orm的时候多加一个using,指定使用哪个库。

models.User.objects.using('default').create(name='张三', pwd='123', phone=1234)

如果是自动的话,在项目的app中创建db_router.py文件,并在该文件中定义一个数据库路由类名字随意,用来进行读写分离,这个类最多提供四个方法,分别是:db_for_read、db_for_write、allow_relation、allow_migrate。

class Router1:
		def db_for_read(self, model, **hints):
				return 'db1'

		def db_for_write(self, model, **hints):
				return 'db2'

然后在配置文件里配置上DATABASE_ROUTERS = [我们写的类的路径,]

django-路由分发

当我们的应用过多的时候,把所有的路径都写在一个文件里不方便管理,路由分发,可以让相同应用的请求,由一个专门的urls文件转发。

首先我们导入urls包下的include函数,然后在url把转发的app的urls文件作为参数传给include即可。

django-反向解析

说白了,就是通过路由的别名,拿到路由的地址。这样可以动态根据路由别名获得路径,一旦路径改变,不需要改其他代码。使用方法很简单,导入reverse,直接把路由别名作为参数传入即可。

django-RBAC

rbac就是做不同的角色的不同权限控制,这种控制基本在每个项目中都有作用。因为这了这样的控制之后,对于后续使用的时候,直接给某个用户加入这个角色,他就拥有了一些功能。

dajngo-反向生成数据类

格式:python manage.py inspectdb 数据库中表名)> 到哪个app下的models.py

python manage.py inspectdb home > ajk/models.py

django-F和Q查询

F查询:取出字段值,可以参与比较或运算

Q查询:创建与或非条件

django-only与defer查询

only是只查该字段 直接将结果封装到返回给你的对象中
点该字段 不需要再走数据库
但如果你点了不是括号内的字段 就会频繁的去走数据库查询

defer是查除了该字段的 所有字段 直接将结果封装到返回给你的对象中
点该其他字段 不需要再走数据库
但如果你点了不是括号内的字段 就会频繁的去走数据库查询

django-反向查询

在我们创建表字段的时候,指定related_name取个别名,另外要指定这个字段要关联哪个表。

class level(models.Model):
 l_name = models.CharField(max_length=50,verbose_name="等级名称")
 def __str__(self):
  return self.l_name
  
class userinfo(models.Model):
 u_name = models.CharField(max_length=50,verbose_name="用户名称")
 u_level = models.ForeignKey(level,related_name="lev")

正向查询
userinfo.object.get(pk=1).u_level
反向查询
level.objects.get(pk=1).lev.all()

django-orm

对象关系映射(Object Relational Mapping,简称ORM)模式是一种为了解决面向对象与关系数据库存在的互不匹配的现象的技术。

简单的说,ORM是通过使用描述对象和数据库之间映射的元数据,将程序中的对象自动持久化到关系数据库中。

二、DRF

drf-序列化器

我们现在的数据交互一般都是用json格式,所以drf帮助我们做了一部分工作,可以帮助我们转换json格式,并且能够帮助我们检验一些字段,一般我们使用drf,都是序列化器加视图一起使用,当视图配置好了之后,我们的大部分逻辑会写在序列化器里面。序列化器和forms组件的使用差不多,写一个序列化类,然后在里面定义检验字段,然后也有局部钩子,全局钩子。

这里面有一些高级用法,比如source,可以修改返回前端的字段名,并且如果我还有自己的字段检验规则,可以配置source里,他会加括号执行,还有就是我们可以利用souce跨表操作。大致实现思路是,先按照点切割,然后看切割出来的字符串是不是可调用(即有没有call魔术方法),如果不可调用,直接去表模型里把字段反射出来,如果可调用,那就加括号执行,如果是多个字符串,比如publish.author.name,那么就for循环一层一层的重复上述过程

drf-jwt

jwt的本质是token,token是服务端生成的一串字符串,在用户第一次登陆后生成,后续用户的请求只要携带token就行了,不用带用户名和密码,减轻服务器的查询压力。

jwt有三部分组成,header(头部),payload(荷载),signature(签证),前两部分base64编码,是可以反解的,最后一部分是由前两步base64编码后,再加密组成,通常用SHA256,不可反解。

头部里面,存放两部分信息,声明类型和加密算法。

荷载里存在一些有效信息,一些公共声明和私有声明,都是一些键值对,因为是可以反解的,所以一般不放什么敏感信息。

第三部分签证,就是把前两部分base64编码后,再加密,在这个过程中,可以加一些盐,组合加密,更安全一点。

drf使用jwt还需要另外安装一个包。

drf-视图组件

视图组件一般和序列化器一起使用,说白了就是原生的django的视图函数,都是竭诚的django的view,drf继承了这个view之后,还派生了许多自己的方法。让我们开发更快。首先是基础的两个视图类,APIView和GenericAPIView,一般,如果我们的视图和数据库无关的话,使用APIView。

APIView是继承了原生Django的View,需要我们自己写对应请求方法的代码。具体使用和原生django的view使用基本相同。

GenericAPIView继承了APIView,考虑到使用APIView时,当我们写多个类,变化的代码只有调用的myserializers类和自己的表模型,所以将变量提取了出来。就是那些model表和序列化器,现在直接在类里定义

queryset = models.Book.objects.all()
serializer_class = serializer.BookModelSerializer

后续使用的话,就是直接调用方法来使用

在两个视图基类后面,有五个扩展类,对应的是常用的五个方法,还有九个子类,就是这五个扩展类的组合。最后还有视图集,我们常用的ViewSetMixin,他重写了as_view(),这里我们现在应该传一个字典,key和value是请求方法,对应的视图函数。并且我们就可以使用router自动生成路由。ViewSet,继承了ViewSetMixin和APIView,GenericViewSet继承了ViewSetMixin和GenericAPIView

drf-xadmin

是一个后台管理的模板框架。django自己有内置一个后台管理,是admin,不过样式和功能偏少。xadmin安装很简单,pip安装之后,配置文件的app里注册一下,然后路由里写上路径,之后在admin文件里注册一下,就可以使用。

drf-自动生成接口文档

使用coreapi自动生成接口文档,pip安装后我们管自己书写接口,然后项目运行之后就可以看到自动生成的文档。

posted @ 2023-08-24 10:44  王寄鱼  阅读(4)  评论(0编辑  收藏  举报