Cool to use for the Django Framework.


Keywords
admin, apiview, django, django-cool, model, websocket
License
BSD-3-Clause
Install
pip install django-cool==1.1.2

Documentation

Django Cool

image

Django 框架快速使用扩展库

【阅读文档】

本项目在以下代码托管网站同步更新:

安装与升级

目前 Django Cool 支持的 Python 环境有 3.6, 3.7, 3.8, 3.9, 3.10, 3.11, 3.12 支持 Django 版本 2.2, 3.x, 4.x, 5.x

为了简化安装过程,推荐使用 pip 进行安装

升级 Django Cool 到新版本:

pip install -U django-cool

如果需要安装 GitHub 上的最新代码:

pip install https://github.com/007gzs/django-cool/archive/master.zip

如果需要展示html接口文档需要安装markdown依赖:

pip install markdown

如果使用websocket功能需要安装channels依赖:

pip install channels>=2.4

开始使用

settings.py 配置

INSTALLED_APPS 中添加 cool

settings.py 中设置 DJANGO_COOL

models扩展

自定义 Model 继承 BaseModel 可使用扩展功能:

  • 支持字段变更监控记录
    • 通过 save_changed() 保存已修改字段
  • 主键唯一键缓存
    • 缓存获取: get_obj_by_pk_from_cache() get_obj_by_unique_key_from_cache()
    • 删除缓存: flush_cache_by_pk() flush_cache_by_unique_key() flush_cache()
  • 搜索字段自动生成
    • get_search_fields() 自动生成搜索字段,默认返回所有设置索引的char和int类型字段

后台管理扩展

BaseModelAdmin 提供扩展功能:

  • 默认列出所有基础字段
  • 增加相关项列,通过外键快速跳转
  • 增、删、改权限统一控制
  • 提交保存时,检查数据是否被修改

使用 admin_register() 装饰器可以快速将 Model 注册到后台管理

api接口扩展

  • CoolBFFAPIView 可方便创建 application/x-www-form-urlencoded / multipart/form-data 方式的接口。
  • Meta 类中配置参数列表 param_fields 后可以自动生成接口文档,自动做参数验证
  • 使用 ViewSite 快速注册接口生成 urlpatterns

使用样例:

`views.py`:

from cool.views import ViewSite, CoolBFFAPIView, ErrorCode, CoolAPIException
from django.contrib.auth import authenticate, login
from django.db import IntegrityError
from django.db.models import Q
from rest_framework import fields

from . import serializer, constants

site = ViewSite(name='demo', app_name='demo')


@site
class UserRegister(CoolBFFAPIView):

    name = '用户注册'
    response_info_serializer_class = serializer.UserSerializer

    def get_context(self, request, *args, **kwargs):
        user = models.User.objects.filter(
            Q(username=request.params.username) | Q(mobile=request.params.mobile)
        ).first()
        if user is not None:
            if user.username == request.params.username:
                raise CoolAPIException(ErrorCode.ERR_DEMO_DUPLICATE_USERNAME)
            elif user.mobile == request.params.mobile:
                raise CoolAPIException(ErrorCode.ERR_DEMO_DUPLICATE_MOBILE)
        user = models.User()
        user.username = request.params.username
        user.mobile = request.params.mobile
        user.nickname = request.params.nickname
        user.name = request.params.name
        user.avatar = request.params.avatar
        user.gender = request.params.gender
        user.set_password(request.params.password)
        try:
            user.save(force_insert=True)
        except IntegrityError as exc:
            if exc.args[0] == 1062:
                if exc.args[1].find('username') >= 0:
                    exc = CoolAPIException(ErrorCode.ERR_DEMO_DUPLICATE_USERNAME)
                elif exc.args[1].find('mobile') >= 0:
                    exc = CoolAPIException(ErrorCode.ERR_DEMO_DUPLICATE_MOBILE)
            raise exc
        user = authenticate(self, base_username=request.params.username, base_password=request.params.password)
        if user is None:
            raise CoolAPIException(ErrorCode.ERR_DEMO_NOTFOUND)
        login(request, user)
        return serializer.UserSerializer(user, request=request).data

    class Meta:
        param_fields = (
            ('username', fields.CharField(label='登陆名', max_length=64, help_text='字段说明,会显示在接口文档中')),
            ('password', fields.CharField(label='密码'),
            ('gender', fields.ChoiceField(label='性别', choices=constants.Gender.get_choices_list())),
            ('mobile', fields.RegexField(r'1\d{10}', label='手机号')),
            ('nickname', fields.CharField(label='昵称', max_length=255)),
            ('name', fields.CharField(label='姓名', default='', max_length=255)),
            ('avatar', fields.ImageField(label='头像', default=None)),
        )


urls = site.urls
urlpatterns = site.urlpatterns

`urls.py`:

示例项目

demo项目