用于Django框架很酷。
django-cool的Python项目详细描述
Django 框架快速使用扩展库
本项目在以下代码托管网站同步更新:
安装与升级
目前 Django Cool 支持的 Python 环境有 3.6, 3.7, 3.8 支持 Django 版本 2.2, 3.0, 3.1
为了简化安装过程,推荐使用 pip 进行安装
pip install django-cool
升级 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
INSTALLED_APPS=(...'cool',)
在 settings.py 中设置 DJANGO_COOL
DJANGO_COOL={'API_ERROR_CODES':(('ERR_DEMO_NOLOGIN',(10001,'请先登陆')),('ERR_DEMO_NOTFOUND',(10002,'用户名密码错误')),('ERR_DEMO_PERMISSION',(10003,'权限错误')),('ERR_DEMO_DUPLICATE_USERNAME',(10011,'用户名已存在')),('ERR_DEMO_DUPLICATE_MOBILE',(10012,'手机号已存在')),)}
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 注册到后台管理
@admin_registerclassModule(BaseModel):name=models.CharField('module name',max_length=255)code=models.CharField('module code',max_length=100,unique=True)@admin_register(list_display=['module','name'],list_filter=['module',],change_view_readonly_fields=['code',],list_editable=['name','module'])classPermission(BaseModel):name=models.CharField('permission name',max_length=255)code=models.CharField('permission code',max_length=100)module=model.ForeignKey(Module,verbose_name='module',to_field='code',db_column='module_code',on_delete=models.PROTECT)
api接口扩展
- CoolBFFAPIView 可方便创建 application/x-www-form-urlencoded / multipart/form-data 方式的接口。
- Meta 类中配置参数列表 param_fields 后可以自动生成接口文档,自动做参数验证
- 使用 ViewSite 快速注册接口生成 urlpatterns
使用样例:
views.py:
fromcool.viewsimportViewSite,CoolBFFAPIView,ErrorCode,CoolAPIExceptionfromdjango.contrib.authimportauthenticate,loginfromdjango.dbimportIntegrityErrorfromdjango.db.modelsimportQfromrest_frameworkimportfieldsfrom.importserializer,constantssite=ViewSite(name='demo',app_name='demo')@siteclassUserRegister(CoolBFFAPIView):name='用户注册'response_info_serializer_class=serializer.UserSerializerdefget_context(self,request,*args,**kwargs):user=models.User.objects.filter(Q(username=request.params.username)|Q(mobile=request.params.mobile)).first()ifuserisnotNone:ifuser.username==request.params.username:raiseCoolAPIException(ErrorCode.ERR_DEMO_DUPLICATE_USERNAME)elifuser.mobile==request.params.mobile:raiseCoolAPIException(ErrorCode.ERR_DEMO_DUPLICATE_MOBILE)user=models.User()user.username=request.params.usernameuser.mobile=request.params.mobileuser.nickname=request.params.nicknameuser.name=request.params.nameuser.avatar=request.params.avataruser.gender=request.params.genderuser.set_password(request.params.password)try:user.save(force_insert=True)exceptIntegrityErrorasexc:ifexc.args[0]==1062:ifexc.args[1].find('username')>=0:exc=CoolAPIException(ErrorCode.ERR_DEMO_DUPLICATE_USERNAME)elifexc.args[1].find('mobile')>=0:exc=CoolAPIException(ErrorCode.ERR_DEMO_DUPLICATE_MOBILE)raiseexcuser=authenticate(self,base_username=request.params.username,base_password=request.params.password)ifuserisNone:raiseCoolAPIException(ErrorCode.ERR_DEMO_NOTFOUND)login(request,user)returnserializer.UserSerializer(user,request=request).dataclassMeta: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.urlsurlpatterns=site.urlpatterns
urls.py:
fromdjango.contribimportadminfromdjango.urlsimportpath,includefromcool.viewsimportget_api_doc_htmlapi_patterns=[path('demo/',include('example.apps.demo.views')),]urlpatterns=[path('cool/',include('cool.urls')),path('admin/',admin.site.urls),path('api/',include(api_patterns)),path('api_doc.html',get_api_doc_html)]
示例项目
- 项目
标签: