quanttide / quanttide-handbook-of-django Goto Github PK
View Code? Open in Web Editor NEW量潮Django手册
Home Page: https://quanttide.github.io/quanttide-handbook-of-django/
量潮Django手册
Home Page: https://quanttide.github.io/quanttide-handbook-of-django/
初步计划使用Django默认的message机制接入,Celery及Django实现作为备选。
由于DRF没有默认支持Django message Framework,需要使用drf-messages项目提供接口方便前端或者其他微服务读取。
message框架是用来给用户发一次性消息通知,且是用来跟着某个请求的,比如用户登录表单返回结果。
使用Pulsar。
用框架自带的cache和message分别实现被动获取和主动推送消息。自研django-pulsar会负责实现这个特性,并且尽可能把Pulsar的逻辑翻译成Django,并且适当地根据需要扩展。
singal使用订阅发布模式,和MQ的模式比较符合,只需要把Broker换成MQ就可以。
message和singal等框架有较大可能性不适合改造。这种情况下使用Celery。如果使用Celery,则需要实现Celery的Pulsar broker。
同步生产者微服务到消费者微服务。
推送消息到MQ,根据延时规则推送,触发相关逻辑运行。
Pulsar原生支持。Django框架是否支持待研究。
Django的message、singal、cache都没有支持定时。可以使用django-cron一类的工具来使用操作系统的定时程序,也可以使用Celery实现,或者django-apschedular来解决。
django-cid: 提供了一个Correlation ID,可以追踪同一个请求的环节,方便在日志里追溯链路。对于所谓的“全链路追踪”,这是一个很有用的特性。如果能做到微服务版的全链路追踪就更好了,并且如果可以和云服务配合(比如日志服务)就更好了。
多态模型指Django模型及其继承产生的子类。
django-polymorphic
提供了方便的接口处理。
在Django中使用TextChoices
类型定义模型字段时,建议为枚举值使用大写字母和下划线来命名,以便更好地阅读和理解。此外,建议在定义枚举值时,使用格式('value', 'verbose_name')
,其中value
是枚举值的实际值,verbose_name
是枚举值的人类可读名称。这有助于提高代码的可读性和可维护性。
例如,如果您要定义一个表示订单状态的枚举类型,可以按以下方式命名:
from django.db import models
class Order(models.Model):
class Status(models.TextChoices):
CREATED = 'created', '创建'
PROCESSING = 'processing', '处理中'
SHIPPED = 'shipped', '已发货'
DELIVERED = 'delivered', '已送达'
status = models.CharField(choices=Status.choices, max_length=20)
在上述代码中,我们定义了一个名为Status
的枚举类型,其中包含了四个订单状态枚举值:CREATED
、PROCESSING
、SHIPPED
和DELIVERED
。每个枚举值都包含了它的实际值和人类可读名称。在模型中,我们使用CharField
类型来存储订单状态,它的选项使用了枚举类型的.choices
属性。这样,我们可以在定义订单状态时,不仅可以使用枚举值的实际值,还可以使用人类可读名称,例如:
order = Order.objects.create(status=Order.Status.CREATED)
print(order.get_status_display()) # 输出:'创建'
这有助于提高代码的可读性和可维护性,使代码更易于理解和组织。
在pre-commit和自动化测试加入:
静态检查和单元测试(pre-commit阶段):
Django部署检查(Django设置有开关,可以对测试和生产打开):
初步计划使用Celery。
由于AutoField不可以用在非主键字段,而我们规定必须使用UUID作为主键(以确保分布式系统的一致性得到很好的解决),因此我们需要一个自定义的NumberField来提供类似于AutoField的逻辑。
默认使用None
更合适,因为None
表示缺少值,而空字符串''
表示一个空的字符串值。
在TextField
和CharField
字段中,如果使用空字符串''
作为默认值,那么当在模型实例中未显式设置该字段时,该字段将被保存为空字符串。这可能会导致意外的行为,例如当使用字符串索引时,将会将空字符串视为一个有效的值。
另一方面,如果使用None
作为默认值,则该字段将在模型实例中缺少值时保持为None
,这更符合缺少值的语义,并且可以避免上述问题。
因此,建议使用None
作为TextField
和CharField
字段的默认值,除非您有充分的理由使用空字符串。
Singal提供了一套发布订阅模式的接口。如果可以把消息队列作为底层,就可以提供跨服务的发布订阅能力,就可以把我们系统内的大部分微服务之间的消息传递打通,从而解决这个关键的机制设计问题。
具体我们需要解决Django框架和消息队列的对接方案,通过django-quanttide-cloud
定义,云计算标准和Django框架标准的交叉。
可选的方案包括:
分类(classification)字段包括:
type
类型:CharField
字段,带预先定义的Choice
类。一般不可以嵌套。用以表示系统预置的、和系统内部逻辑密切相关的类型。category
类别:django-mptt
库实现树状结构。用以表示用户定义的业务意义的、可以嵌套的一对多的分类。用法也通常由用户定义。比如淘宝京东的商品分类。tag
标签:django-taggit
库,不使用默认而使用自定义Tag模型来区分标签的业务意义。用以表示用户定义的、可以多对多关系的分类。A declarative, efficient, and flexible JavaScript library for building user interfaces.
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google ❤️ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.