7 认证相关

认证相关

  • 7 认证相关
    • 今日详细
      • 1. 代码整合
      • 2.通用认证组件
        • 2.1 处理访问记录
        • 2.2 登录之后才具有评论和发布
      • 3.随意的接口
      • 结论:在serializer中可以调用request
      • 4.完善详细页面
    • 总结
      • 1. 小程序
        • 1.1 申请账号APPID
        • 1.2 搭建开发者工具
        • 1.3 目录结构
        • 1.4 组件
        • 1.5 微信API
        • 1.6 事件
        • 1.7 双向绑定 mvvm
        • 1.8 指令
        • 1.9 自定义tabbar
      • 2.API(DRF)
        • 2.1 视图
        • 2.2 序列化器
          • 2.2.1 校验
          • 2.2.2 序列化
        • 2.3 认证
        • 2.4 状态码
      • 3.其他

7 认证相关

各位小伙伴想要博客相关资料的话关注公众号:chuanyeTry即可领取相关资料!

认证结合之后的效果:

  • 发布页:未登录,点发布跳转到登录页面。
  • 首页:不用登录
  • 详细页面:不用登录、如果登录就需要在访问记录中添加一条数据。
    • 评论,跳转到登录页面
    • 点赞,跳转到登录页面
  • 个人中心,无需登录
  • 登录页面,无需登录

今日详细

1. 代码整合

登录成功之后保存 nickname和avatar

2.通用认证组件

request.user

  • None,未登录
  • 不为空,用户对象
2.1 处理访问记录

【demos - 4 - 认证组件.zip】

【demo - 4 - 认证组件.zip】

2.2 登录之后才具有评论和发布
  • 小程序

    • 按钮点击的时候先做判断?
    • 自定义tabbar
    • 携带token
      • url
      • header
        • Authorization: token asdfauposdifuaskjdfpoaiusdfj
  • api

    • 两个认证类

    • 应用场景:

      • 都不需要登录视图

      • 都需要认证的视图

      • 有的需要&有的不需要(自定义get_authenticators)

        class CommentView(APIView):def get_authenticators(self):if self.request.method == 'POST':return [UserAuthentication(), ]return [GeneralAuthentication(), ]def get(self,request,*args,**kwargs):root_id = request.query_params.get('root')# 1. 获取这个根评论的所有子孙评论node_queryset = models.CommentRecord.objects.filter(root_id=root_id).order_by('id')# 2. 序列化ser = CommentModelSerializer(instance=node_queryset,many=True)return Response(ser.data,status=status.HTTP_200_OK)def post(self,request,*args,**kwargs):# 1. 进行数据校验: news/depth/reply/content/rootser = CreateCommentModelSerializer(data=request.data)if ser.is_valid():# 保存到数据库ser.save(user_id=1)# 对新增到的数据值进行序列化(数据格式需要调整)news_id = ser.data.get('news')models.News.objects.filter(id=news_id).update(comment_count=F('comment_count')+1)return Response(ser.data,status=status.HTTP_201_CREATED)return Response(ser.errors,status=status.HTTP_400_BAD_REQUEST)

3.随意的接口

结论:在serializer中可以调用request

class TestSER(serializers.ModelSerializer):xx = serializers.SerializerMethodField()class Meta:model = models.Topicfields = "__all__"def get_xx(self,obj):# 获取request 、 request.userself.context['request'].userreturn 123class TestView(ListAPIView):queryset = models.Topic.objectsserializer_class = TestSER

4.完善详细页面

  • 点赞

总结

1. 小程序

1.1 申请账号APPID
1.2 搭建开发者工具
1.3 目录结构

小程序文件的目录结构

  • config
    • api.js
    • settings.js
  • components
  • pages
    • index
      • index.js
      • index.wxml
      • index.wxss
      • index.json
  • utils
  • static
  • app.js
  • app.json
  • app.wxss
1.4 组件
  • view/text/image
  • textarea/navigator/input/button
  • block/cover-view/cover-image/swiper
1.5 微信API
  • request/navigateto/back/switchtab/chooseimage/chooseloacation
  • getUserInfo + button + opensetting
  • showToast/showloading/hideloadding
  • setstoragesync/setstoreagesync
  • getApp/ getcurrenpages
1.6 事件
  • 自定义事件
    • bindtab
    • bindinput
  • onload/onshow/onread/onunload/onhide/onpulldownrefresh/onreachbuttom/onshareappmessage
  • onlunch
1.7 双向绑定 mvvm
  • setData全部

  • setData局部

    setData({['xx.xx.xx.x']:123
    })
    
    var v1 = 1;
    var v2 = 2;
    var v3 =v1+v2;
    setData({['xx.xx['+ v3 +']x']:123
    })
    
1.8 指令
  • for
  • if
1.9 自定义tabbar

2.API(DRF)

2.1 视图
  • APIView

  • ListAPIView…

  • 视图中自定义方法

    • 选择serializer

      class TestView(ListAPIView,CreateAPIView):queryset = models.Topic.objectsserializer_class = TestSERdef get_serializer_class(self):if self.request.method == "GET":return TestSERreturn TestSER
      
    • 选择authenticator

      class TestView(ListAPIView,CreateAPIView):queryset = models.Topic.objectsserializer_class = TestSERdef get_authenticators(self):if self.request.method == "GET":return [UserAuthentication(), ]return [GeneralAuthentication(), ]
      
    • 自定义视图函数

      class TestView(ListAPIView,CreateAPIView):queryset = models.Topic.objectsserializer_class = TestSERdef get(self,request,*args,**kwargs):response = super().get(request,*args,**kwargs)return response
    • 自定义filter做筛选(maxid/minid)

2.2 序列化器

他有两个作用:序列化、校验。

2.2.1 校验
class TestSER(serializers.ModelSerializer):class Meta:model = models.Topicfields = "__all__"
is_valid
  • 自定义校验规则

    import re
    from rest_framework.exceptions import ValidationErrordef phone_validator(value):if not re.match(r"^(1[3|4|5|6|7|8|9])\d{9}$",value):raise ValidationError('手机格式错误')class TestSER(serializers.ModelSerializer):title = serializers.CharField(label='手机号',validators=[phone_validator,])class Meta:model = models.Topicfields = "__all__"
    
  • 自定义方法校验

    class TestSER(serializers.ModelSerializer):title = serializers.CharField(label='手机号')class Meta:model = models.Topicfields = "__all__"def validate_title(self, value):# 具体的校验规则return value
    
  • 嵌套校验

    class CreateNewsTopicModelSerializer(serializers.Serializer):key = serializers.CharField()cos_path = serializers.CharField()class CreateNewsModelSerializer(serializers.ModelSerializer):imageList = CreateNewsTopicModelSerializer(many=True)class Meta:model = models.Newsexclude = ['user', 'viewer_count', 'comment_count',"favor_count"]def create(self, validated_data):# 把imageList切走image_list = validated_data.pop('imageList')# 创建New表中的数据news_object = models.News.objects.create(**validated_data)data_list = models.NewsDetail.objects.bulk_create([models.NewsDetail(**info, news=news_object) for info in image_list])news_object.imageList = data_listif news_object.topic:news_object.topic.count += 1news_object.save()return news_object
  • 注意事项:如果定义的字段指向做序列化不做校验。

    class TestSER(serializers.ModelSerializer):title = serializers.CharField(label='手机号',read_only=True)class Meta:model = models.Topicfields = "__all__"
    
2.2.2 序列化
class TestSER(serializers.ModelSerializer):class Meta:model = models.Topicfields = "__all__"
  • 自定义字段+source

    class TestSER(serializers.ModelSerializer):v1 = serializers.CharField(label='手机号',source='get_gender_display')class Meta:model = models.Topicfields = "__all__"
    
  • 自定义时间字段

    class TestSER(serializers.ModelSerializer):v1 = serializers.DateTimeField(format="%Y")class Meta:model = models.Topicfields = "__all__"
    
  • 复杂操作字段

    
    class NewsDetailModelSerializer(serializers.ModelSerializer):images = serializers.SerializerMethodField()create_date = serializers.DateTimeField(format="%Y-%m-%d %H:%M")user = serializers.SerializerMethodField()topic = serializers.SerializerMethodField()viewer = serializers.SerializerMethodField()comment = serializers.SerializerMethodField()is_favor = serializers.SerializerMethodField()class Meta:model = models.Newsexclude = ['cover',]def get_images(self,obj):detail_queryset = models.NewsDetail.objects.filter(news=obj)# return [row.cos_path for row in detail_queryset]# return [{'id':row.id,'path':row.cos_path} for row in detail_queryset]return [model_to_dict(row,['id','cos_path']) for row in detail_queryset]def get_user(self, obj):return model_to_dict(obj.user, fields=['id', 'nickname', 'avatar'])def get_topic(self, obj):if not obj.topic:returnreturn model_to_dict(obj.topic, fields=['id', 'title'])def get_viewer(self,obj):# 根据新闻的对象 obj(news)# viewer_queryset = models.ViewerRecord.objects.filter(news_id=obj.id).order_by('-id')[0:10]queryset = models.ViewerRecord.objects.filter(news_id=obj.id)viewer_object_list = queryset.order_by('-id')[0:10]context = {'count':queryset.count(),'result': [model_to_dict(row.user,['nickname','avatar']) for row in viewer_object_list]}return contextdef get_comment(self,obj):"""获取所有的1级评论,再给每个1级评论获取一个耳机评论。:param obj::return:"""# 1.获取所有的 一级 评论first_queryset = models.CommentRecord.objects.filter(news=obj,depth=1).order_by('id')[0:10].values('id','content','depth','user__nickname','user__avatar','create_date')first_id_list = [ item['id'] for item in first_queryset]# 2.获取所有的二级评论# second_queryset = models.CommentRecord.objects.filter(news=obj,depth=2)# 2. 获取所有1级评论下的二级评论# second_queryset = models.CommentRecord.objects.filter(news=obj, depth=2,reply_id__in=first_id_list)# 2. 获取所有1级评论下的二级评论(每个二级评论只取最新的一条)from django.db.models import Maxresult = models.CommentRecord.objects.filter(news=obj, depth=2, reply_id__in=first_id_list).values('reply_id').annotate(max_id=Max('id'))second_id_list = [item['max_id'] for item in result] # 5, 8second_queryset = models.CommentRecord.objects.filter(id__in=second_id_list).values('id','content','depth','user__nickname','user__avatar','create_date','reply_id','reply__user__nickname')import collectionsfirst_dict = collections.OrderedDict()for item in first_queryset:item['create_date'] = item['create_date'].strftime('%Y-%m-%d')first_dict[item['id']] = itemfor node in second_queryset:first_dict[node['reply_id']]['child'] = [node,]return first_dict.values()def get_is_favor(self,obj):# 1. 用户未登录user_object = self.context['request'].userif not user_object:return False# 2. 用户已登录exists = models.NewsFavorRecord.objects.filter(user=user_object,news=obj).exists()return exists

注意:序列化的方法中获取request

class TestSER(serializers.ModelSerializer):title = serializers.SerializerMethodField()class Meta:model = models.Topicfields = "__all__"def get_title(self,obj):request = self.context['request']
2.3 认证
  • 编写

    
    from rest_framework.authentication import BaseAuthentication
    from api import models
    from rest_framework import exceptionsclass GeneralAuthentication(BaseAuthentication):"""通用认证,如果认证功能则返回数据,认证失败自己不处理,交给下一个认证组件处理。"""def authenticate(self, request):token = request.META.get('HTTP_AUTHORIZATION', None)# 1.如果用户没有提供token,返回None(我不处理,交给下一个认证类处理,则默认是None)if not token:return None# 2.token错误,,返回None(我不处理,交给下一个认证类处理,则默认是None)user_object = models.UserInfo.objects.filter(token=token).first()if not user_object:return None# 3.认证成功return (user_object,token) # request.user/request.authclass UserAuthentication(BaseAuthentication):"""用户认证,用户必须先登录。"""def authenticate(self, request):token = request.META.get('HTTP_AUTHORIZATION', None)# 1.如果用户没有提供token,返回None(我不处理,交给下一个认证类处理,则默认是None)if not token:raise exceptions.AuthenticationFailed()# 2.token错误,,返回None(我不处理,交给下一个认证类处理,则默认是None)user_object = models.UserInfo.objects.filter(token=token).first()if not user_object:raise exceptions.AuthenticationFailed()# 3.认证成功return (user_object,token) # request.user/request.auth
    
  • 应用认证类

    • 全不需要登录

    • 全需要登录

    • 部分需要登录,重写方法

      class CommentView(APIView):def get_authenticators(self):if self.request.method == 'POST':return [UserAuthentication(), ]return [GeneralAuthentication(), ]def get(self,request,*args,**kwargs):root_id = request.query_params.get('root')# 1. 获取这个根评论的所有子孙评论node_queryset = models.CommentRecord.objects.filter(root_id=root_id).order_by('id')# 2. 序列化ser = CommentModelSerializer(instance=node_queryset,many=True)return Response(ser.data,status=status.HTTP_200_OK)def post(self,request,*args,**kwargs):# 1. 进行数据校验: news/depth/reply/content/rootser = CreateCommentModelSerializer(data=request.data)if ser.is_valid():# 保存到数据库ser.save(user_id=1)# 对新增到的数据值进行序列化(数据格式需要调整)news_id = ser.data.get('news')models.News.objects.filter(id=news_id).update(comment_count=F('comment_count')+1)return Response(ser.data,status=status.HTTP_201_CREATED)return Response(ser.errors,status=status.HTTP_400_BAD_REQUEST)
2.4 状态码
from rest_framework import status例如:Response(serializer.data, status=status.HTTP_201_CREATED, headers=headers)

3.其他

  • js文件导入

  • 三元运算

    条件 ? 真 : 假
    
  • js闭包

  • 自执行函数

  • this 和 箭头函数(es6)

  • django orm

    • F

    • 分组

    • 排序

    • bluk_create

      result1 = models.UserInfo.objects.create(**{})
      result2 = models.UserInfo.objects.create(**{})print(result1.id,result1.name,result2.id,result2.name,)data = models.UserInfo.objects.blukcreate([models.UserInfo(...),models.UserInfo(...)
      ])
      data[0].name/title/email/ ->  id 
      
    • get_or_create

    • 自关联(related_name)

  • 基于Token做的认证、jwt

  • 腾讯对象存储 COS

  • 腾讯短信API

  • django中编写离线脚本

    import os
    import sys
    import djangobase_dir = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
    sys.path.append(base_dir)# 将配置文件的路径写到 DJANGO_SETTINGS_MODULE 环境变量中
    os.environ.setdefault("DJANGO_SETTINGS_MODULE", "demos.settings")
    django.setup()from api import models
    models.Topic.objects.create(title="春运")
    models.Topic.objects.create(title="火车票")
    

    注意:可以结合定时任务。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/621647.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

全新小白菜QQ云端机器人登录系统源码 /去除解密授权学习版源码

源码介绍: 全新小白菜QQ云端机器人登录系统源码,是一款经过全面解密的授权学习版源码。 这款源码已解除了授权版的限制,然而许多人可能对其用途并不了解。实际上,该源码主要面向群机器人爱好者设计。它是一个基于挂机宝机器人框…

RT-DETR算法优化改进:多层次特征融合(SDI)结合PConv、DualConv、GSConv,实现二次创新 | UNet v2最新论文

💡💡💡本文独家改进:多层次特征融合(SDI)高效结合DualConv、PConv、GSConv等实现二次创新 1)替代原始的Concat; RT-DETR魔术师专栏介绍: https://blog.csdn.net/m0_63774211/category_12497375.html ✨✨✨魔改创新RT-DETR 🚀🚀🚀引入前沿顶会创新(CVPR…

Linux 脚本编程题库

1.在主目录下新建一个test.sh文件,脚本功能为查找某文件是否存在(某文件名以参数形式传递),如果文件存在,则修改文件权限为用户主可读写,其他用户无任何权限,否则返回文件不存在! #…

Java期末复习题库(封装,继承,抽象类,接口,GUI)

包与字符串 1.创建包的基本操作 在biology包中的animal包中有human类,它具有name,height,weight的属性,还具有eat(),sleep()和work()的行为,在biology包中的plant包中有flower类,它具有name,color,smell的属性,还具有drink()和blossom()的行为. 现在在一个school包中的garde…

20240113-确定两个字符串是否接近

题目要求 如果可以使用以下操作从另一个字符串获得一个字符串,则认为两个字符串是接近的: 操作1:交换任意两个现有字符。 例如,abcde -> aecdb操作2:将每个出现的一个现有字符转换为另一个现有字符,并…

Go语言开发小技巧易错点100例(十一)

往期回顾: Go语言开发小技巧&易错点100例(一)Go语言开发小技巧&易错点100例(二)Go语言开发小技巧&易错点100例(三)Go语言开发小技巧&易错点100例(四)Go…

优雅处理并发:Java CompletableFuture最佳实践

第1章:引言 大家好,我是小黑,今天,小黑要和大家聊聊CompletableFuture,这个Java 8引入的强大工具。 在Java传统的Future模式里,咱们都知道,一旦开始了一个异步操作,就只能等它结束…

26.9K Star,漫画阅读 APP 开源了

今天推荐是一款适用于 Android 6.0 及更高版本的免费开源漫画阅读器,基于 Kotlin 开发的。这款 APP 完全免费、好用、无广告,自带上千个全球漫画源,在线阅读和下载都很方便,是漫画爱好者必备! 它以插件的形式提供了来自…

wsl2下运行docker

安装docker服务 curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyun无法启动问题 这个错误提示通常是因为系统中使用的是经过修改的 nftables,而 Docker 安装程序使用 iptables 进行 NAT。为了解决这个问题,您可以使用以下命令将系统…

【我想开发一个小程序,大概需要多少钱?】

小程序开发为什么报价差距很大?主要是因为小程序的实现方法和功能模型不同。 小程序的实现方法: 实现方法主要分为SAAS小程序、定制小程序和第三方平台小程序。不同的实现方法价格都是不一样的,大概的区间如下: SAAS小程序和第三…

Zapier/Make.com/数环通/集简云的对比

Zapier/Make.com/数环通/集简云 这四家公司都是为了自动化,这也是流行大趋势。我不想错过未来的大趋势,花了2周时间分别用四家公司的模块实现了相同的任务。 为什么会用2周时间?我第一次接触无代码自动化。最重要的目的是为了白嫖&#xff0…

云卷云舒:数据库2023年度盘点

一、年度总结词 云、卷 二、年度大事记 1 月 10 日,KaiwuDB(原:开务数据库) 发布了 KaiwuDB 1.0 时序数据库,其运用到实时就地运算等核心专利技术,专为工业物联网、数字能源、交通车联网、智慧产业等场景…

office办公技能|word中的常见通配符使用

一、删除Word中含有指定内容的整行 操作方法: 1、快捷键 CtrlH,打开Word的查找替换窗口,单击【更多】按钮,勾选“使用通配符”。 2、在查找内容处,输入“替换内容*^13”,替换为处什么都不填。 3、单击【…

13. 抽象类(abstract关键字)

抽象类 抽象类1. 抽象类1.1 定义格式1.2 特点 2. 抽象方法2.1 定义格式2.2 特点 3. abstract关键字 抽象类 抽象类是在面向对象编程中,一种特殊的类,它不能被实例化,只能作为其他类的基类来使用。 抽象类和普通类的主要区别在于它包含一个或…

Harbor离线安装

下载安装包 $ wget https://github.com/goharbor/harbor/releases/download/v2.7.4/harbor-offline-installer-v2.7.4.tgz解压 $ tar xvf harbor-offline-installer-v2.7.4.tgz -C /usr/local修改配置 $ cd /usr/local/harbor $ cp harbor.yml.tmpl harbor.yml $ vim harbo…

sqlserver导出数据为excel再导入到另一个数据库

要将SQL Server中的数据导出为Excel文件,然后再将该Excel文件导入到另一个数据库中,你可以按照以下步骤进行操作: 导出数据为Excel文件 echo offset SourceServer源服务器名称 set SourceDB数据库名称 set ExcelFilePath导出到的Excel文件路…

二叉树的遍历(递归法)

递归的三要素: ①确定递归函数的参数和返回值 ②确定终止条件 ③确定单层递归的逻辑 以前序遍历为例: 1、确定递归函数的参数和返回值: 参数中需要传入list来存放节点的数值,除了这一点就不需要再处理什么数据了也不需要有返…

【文献解读】“MOBILEViT:轻量级、通用目的、移动友好的视觉变换器”。

今天阅读这篇2022年ICLR会议上发表的论文,主要是为了学习MobileViT模型,用于YOLO模型主干改造。 一、文献概述 作者:Sachin Mehta 和 Mohammad Rastegari。地点:作者所属机构是 Apple。内容简述: 提出了一种名为Mob…

手把手Docker部署Gitblit服务器

1拉取镜像 docker pull jacekkow/gitblit:v1.9.1 2.启动 docker run -d --name gitblit --restart always -p 10006:8080 -p 18443:8443 -p 19418:9418 -p 29418:29418 -v /data/gitblit/data:/opt/gitblit-data jacekkow/gitblit:v1.9.1 3.查看 默认账户/密码:admin/adm…

我的技术栈

.NET、.NET Core、C#11、Entity Framework、ASP.NET MVC、Linq、Lambda、Dapper、 Web Service、WCF、Web API、SOAP、HTTP、XML、JSON、RESTful、Protocol Buffers、 U3D、IOC、AOP、 SOAPRPCHTTPXML TCP/IP和UDP Web服务器:Nginx、IIS、Tomcat、Apache、 开发框架…