【项目】Django后端需求实现记录

需求: 记录用户习惯

用户查看下一个图表时, 希望能记住自己当前的习惯配置. 比如你在B站看视频调低了音量, 打开下一个视频 音量应该和上一次相同. 需要被记录的习惯项目有5个: 是否显示网格线, 图例 etc. …

分析

需要传一个config字典, 保存用户习惯, (这样就可以不止5个, 多少个习惯, 习惯的种类, 这些是前端的事)

代码

code/core/models.py

class Account(models.Model):
	###
	config = models.JSONField(verbose_name="用户配置", default=dict)

在数据库中添加一列 然后migration

code/core_api/views/v2/project_member.py

class AccountViewSet(BaseViewSet):
    """工作区用户接口"""
    ###
    @schema_decorator(
        {
            "config": Validation(DictValidator(), "配置", optional=True),
        }
    )
    @action(methods=["post", "get"], detail=True, url_path="habit")
    def habit(self, request, pk):
        account = request.user
        if request.method == "GET":  # 前端获取用户配置习惯
            return APIResponse(account.config)
        # 前端更新用户配置习惯
        account.config = self.validated_data.get("config", {})
        account.save()
        return APIResponse(account.config)

需求: 最近搜索

调用recommender类的member_last_question方法, 实现"最近搜索"接口.

代码

code/core_api/views/v3/project_member.py

    @action(methods=["get"], detail=True, url_path="last-questions")
    @project_member_required
    @schema_decorator(
        {
            "count": Validation(IntValidator(), "count", optional=True),
        }
    )
    def last_questions(self, request, pk):
        """最近搜索"""
        words = []
        question = Question3(
            self.project_config,
            words,
            fuzzy=True,
            fuzzy_min_length=1,
            homonym=True,
            homonym_min_length=1,
        )
        recommender = Recommender(
            self.member,
            question,
            self.project_config,
        )
        result = recommender.member_last_questions(self.validated_data.get("count"))
        return APIResponse(result)
注:

这个写得有点问题, 最后没被merge

需求: 审计日志

审计日志: 需要在所有涉及对敏感数据的修改查询操作的接口打log (安全审计, 如果没有的话 没法中标)

分析

涉及文件:
code/core_audit/models.py

这个文件的定义了EventLog类(models其实是Django对数据库操作的封装), 该类定义了审计日志应该记录的内容.

from django.db import models

from core_audit.constants import EventTrigger, EventType


class EventLog(models.Model):
   created_at = models.DateTimeField(auto_now_add=True, verbose_name="发生时间")
   name = models.IntegerField(choices=EventType.choices(), verbose_name="事件类型")
   trigger = models.IntegerField(choices=EventTrigger.choices(), verbose_name="触发来源")
   content = models.JSONField(null=True, verbose_name="事件详情")
   client_id = models.IntegerField(null=True, verbose_name="客户ID")
   account_uid = models.UUIDField(null=True, verbose_name="用户UID")
   source_ip = models.GenericIPAddressField(null=True, verbose_name="请求IP地址")
   err_code = models.CharField(null=True, max_length=32, verbose_name="状态码")
   err_message = models.CharField(null=True, max_length=255, verbose_name="事件错误信息")
   version = models.IntegerField(verbose_name="版本")

   class Meta:
       indexes = [
           models.Index(fields=["client_id", "created_at", "account_uid"]),
       ]

code/core_audit/commands.py
这个文件里定义了一些函数

下面是涉及敏感操作接口的文件
code/core_api/views/v2/project_admin
code/core_api/views/v2/client_admin
code/core_openapi/views/v1/account.py

代码

需求: 忽略大小写

关键词搜索忽略大小写

代码

code/core_api/views/v2/project_member.py

            # 有查询词根据查询词过滤
            if q := self.validated_data.get("q"):
                for name in measure[ConfProp.NAMES]:
                    if q in name: #删
                    if q.lower() in name.lower(): #增
                        names.append(name)
                        break
            else:

code/core_project/commands/dimension.py

                if not attr.get(ConfProp.IS_KEYWORD):
                    # 本身名称包含有搜索词,添加
                    for name in attr[ConfProp.NAMES]:
                        if word in name: #删
                        if word.lower() in name.lower(): #增
                            result.children.append(DimensionTreeNode(name, attr_prop))
                            break
                # 是关键词
###
                    if not keywords.exists():
                        # 判断名称是否包含
                        for name in attr[ConfProp.NAMES]:
                            if word in name: #删
                            if word.lower() in name.lower(): #增
                                result.children.append(DimensionTreeNode(name, attr_prop))
                                break
                    # 有对应的关键词
###
                result.children.append(dimension_node)
            else:
                for name in dimension[ConfProp.NAMES]:
                    if word in name: #删
                    if word.lower() in name.lower(): #增
                        result.children.append(DimensionTreeNode(name, dimension_prop))
                        break

需求: 处理历史报错

背景:

make run_web启动服务,网页能正常启动,但最开始会报hana_ml.dataframe - ERROR - ModuleNotFoundError: No module named 'shapely'的信息。现在需要处理掉这条信息。经查是某个文件引用的hana_ml.dataframe中,引用了shapely这个包,但这个包其实可有可无,因为这个dataframe.py中引用这个包的地方是这么写的:

try:
    from shapely import wkt
except ImportError as error:
    logging.getLogger(__name__).error("%s: %s", error.__class__.__name__, str(error))

把except下面那行注释掉以后,就没有报错了。但这只解决了本地的问题。

解决:

执行pipenv install shapely,会在Pipfile文件中增加一条依赖。注意依赖要锁版本,按字典序排序。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值