OTP 避免了一些静态密码认证相关系的缺点,不容易受到重放攻击,比如常见的注册场景,用户的邮箱或短信会收到一条一次性的激活链接,或者收到一次随机的验证码(只能使用一次),从而验证了邮箱或手机号的有效性。...今天讲一下如何用 Django REST framework[1](DRF) 来实现 OTP,阅读本文需要一定的 DRF 的基础知识。...}, write_only=True) # 利用drf中的validators验证username是否唯一 username = serializers.CharField(required...最后的话 一次性验证码(OTP)的逻辑简单,需要思考的是如何在 DRF 的框架中填空,填在哪里?...这其实需要了解 DRF 的 ModelSerializer 类和 ViewSet 类之前的关系,在调用关系上,ViewSet 类调用 ModelSerializer 来实现字段的验证和数据保存及序列化,
在使用django restframework serializer 序列化在django中定义的model时,有时候我们需要额外在serializer中增加一些model中没有的字段。...当不指定其method_name时,默认为get_field_name 如果使用ModelSerializer并指定字段时,要包含此时定义的字段 补充知识:django restframework Serializer...它通过调用它所连接的序列化类的方法来获得它的值。它可用于将任何类型的数据添加到对象的序列化表示中。...:我们提交的表单数据存在于多表中(因为表中含有多对多字段),如何验证所有字段,并保存完整的数据到各表中。...对象上,当create或update的时候就会被添加进数据库,相当于validated_data.update(kwargs) 实际源码不是这样子,但也就是这么个意思。
除了将Django模型序列化为JSON格式外,序列化器还可以将其序列化为其他格式,例如XML或YAML。我们只需要更改序列化器类的父类,以便它可以处理特定格式的数据。序列化器还可以用于验证输入数据。...我们指定了要包含在序列化器中的字段以及每个字段的属性。我们还指定了密码字段的write_only属性,这意味着在反序列化期间它将不会被返回。...总结序列化器是DRF中的一个核心概念,它允许我们将Django模型转换为序列化的格式,并反之亦然。...使用序列化器,我们可以将Django模型序列化为JSON、XML或YAML格式,以便我们可以将其发送到前端应用程序。序列化器还可以帮助我们验证输入数据,并确保数据的有效性。...在DRF中,我们使用Serializer或ModelSerializer类来定义序列化器,具体取决于我们是否要序列化Django模型。序列化器还可以用于验证输入数据,并将其转换为Django模型。
会同时生成 user 表和 user_profile 表 这个方法虽然是官方推荐的,但是个人还是觉得很麻烦,获取 profile 的字段值还需要通过 user 表的外键获取 profile 实例,然后再获取字段值...[your_user_model_name]' # 例如我这边设置的值为 'expert.User' 在 admin 中,我们按照之前的方法照常设置就行 这种方法,需要在我们做数据库迁移之前,先定义好我们自己的...这种方法适合只需要扩展 User Model 中的字段,会继承之前 AbstractUser 的全部字段,系统自带的 User 也是通过继承 AbstractUser 来实现的 # 系统的 User 源码...中的 username 和 is_staff 字段,直接通过 email 作为用户名 class User(AbstractUser, PermissionsMixin): email = models.EmailField...3 补充一下 之前在讨论群(在公众号后台回复“django”,获取入群方式)中,有个老铁问如何通过存在的数据库反向生成 model,因为比较简单,所以这边记顺带录下。
1.read_only read_only=True表示该字段为只读字段,即对应字段只用于序列化时(输出),而在反序列化时(创建对象)不使用该字段。默认值为False。...2.write_only write_only=True表示该字段为只写字段,和read_only相反,即对应字段只用于更新或创建新的Model时,而在序列化时不使用,即不会输出给用户。...需要注意,如果字段设置了default,则隐式地表示该字段已包含required=False,如果同时指定default和required,则会抛出异常。...10.help_text 一个文本字串,可用作HTML表单字段或其他描述性元素中字段的描述。...字段的值给这值) 设置字段值 类似default 通常这个值有外键关联属性可以用source设置 13.validators 验证该字段跟 单独的validate很像 UniqueValidator
一、常见面试问题核心组件与工作流程视图(Views):解释视图在DRF中的作用,介绍基于类的视图(ViewSet、GenericViewSet)与视图集(ViewSets)的概念,以及如何关联到URL。...认证(Authentication):介绍DRF支持的多种认证方式(如Token、Session、OAuth等),以及如何配置全局或视图级别的认证。...过滤(Filtering):介绍使用django-filter库或内置filterset_fields实现资源过滤。排序(Sorting):讲解如何启用排序功能,允许客户端通过查询参数指定排序字段。...二、易错点与避免策略序列化器验证遗漏:确保在序列化器中充分定义验证规则,使用validate_方法对关联字段、自定义逻辑进行验证,防止脏数据进入数据库。...对于复杂查询,考虑使用Django ORM的查询优化技巧或添加数据库索引。
一、DRF的token基本使用 1.DRF的token登录原理 基于DRF的前后端分离登录与单独使用Django登录的原理不同,不再需要CSRF验证,DRF提供了许多开箱即用的身份验证方案,并且还允许实现自定义方案...身份验证方案始终定义为类列表,DRF框架尝试对列表中的每个类进行身份验证,并使用成功进行身份验证的第一个类的返回值设置request.user和request.auth。...2.DRF实现发送短信验证码接口 需要在DRF中接入短信验证码发送。...显然,对于多个字段的验证,如果某一个字段验证失败,则提示该字段的错误信息,如果多个字段验证失败,则将这些字段的错误信息都显示出来。...字段,但是在validate(attrs)又将其删去,导致在序列化时找不到code字段,因此出错,这是需要将字段的write_only设置True,以确保在更新或创建实例时可以使用该字段,但是在序列化表示形式时不包括该字段
安装Django REST Framework(以下简称DRF)非常简单。您只需按照以下步骤操作:创建一个新的Django项目或使用现有的Django项目。在命令行中使用pip命令安装DRF。...它们负责将Django模型转换为JSON、XML或其他格式的数据,并反之亦然。...我们指定了User模型作为序列化器的元数据,并指定了我们想要在JSON中包含的字段。创建视图视图是DRF中的另一个核心概念。它们定义了API的行为,即如何响应请求、如何验证输入等。...我们指定了我们想要返回的所有用户的查询集,并指定了用于序列化数据的序列化器。创建路由路由是将URL映射到视图的一种机制。在DRF中,我们可以使用Django的URLConf和DRF的路由器来定义路由。...DRF有很多其他功能,例如身份验证、权限管理、限速、过滤、分页等等。您可以在DRF的官方文档中找到所有这些功能的详细信息。
这也造成了很多读者误认为Swagger只是Java语言下的一个框架,其实并不是的,Swagger除了能应用在Java语言的工程中,也同时适用于在其它语言下,比如Python。...接下来,在本篇文章,介绍的就是基于Python3+Django3下,如何接入Swagger框架,并且实现Swagger接口文档的自动生成。 2....在django 3.0中已经不支持该库了,取而代之的是全新的第三方drf-yasg库。...创建新组(增) delete: 删除现有的一组(删) partial_update: 更新现有组中的一个或多个字段...5、在Swagger中还可以查看到在model定义的各字段类型及参数说明。 ? 到此,我们Django3接入Swagger已经完成了,更多swagger的功能使用请读者自行尝试。
User模型源码分析 class User(AbstractUser): """ Django 身份验证系统中的用户由该模型表示 需要用户名和密码。...对于一些想要删除账号的数据,我们设置这个值为False就可以了,而不是真正的从数据库中删除。 is_superuser:是否是超级管理员。如果是超级管理员,那么拥有整个网站的所有权限。...Django的验证系统已经帮我们实现了登录验证的功能。...但是有时候还是不能满足我们的需求。比如在验证用户登录的时候,他用的是用户名作为验证,而我们有时候需要通过手机号码或者邮箱来进行验证。还有比如我们想要增加一些新的字段。...,不再需要username字段来校验了,接下来我们验证一下登录,现在的结构需要用phone字段和密码来登录,而不是使用username,我们编写视图函数来尝试 def index(request):
-----", # 默认空显示内容 to_field_name=None, # HTML中value的值对应的字段 limit_choices_to=None...= '' 空值的默认值 ComboField(Field) fields=() 使用多个验证,如下:即验证最大长度20,又验证邮箱格式...,因为在进行钩子验证时,会把值给清空的。...""" Form中字段中定义的格式匹配完之后,执行此方法进行验证 :return: """ value =...', 'invalid') return value 方式四:同时生成多个标签进行验证 from django.forms import Form from django.forms
MySQL数据库中修改表中数据: update 表名 set 字段名=要改的值 [where 查询指定数据的条件] update tb_users set email_active=0 where id...,我们还可以补充额外的验证: a.先写一个函数(如about_django)封装补充验证的功能,然后在字段中添加 validators参数,如下: btitle = serializers.CharField...,validators=[about_django]) b.在序列化器中定义一个方法 validate_,来对 字段进行验证。...return value c.在序列化器中定义 validate方法进行补充验证(结合多个字段内容验证) def validate(self, attrs): # 此处的attrs是一个字典类型的数据...团队开发注意事项 浅谈密码加密 Django框架中的英文单词 Django中数据库的相关操作 DRF框架中的英文单词
通常简称为DRF框架 或 REST framework。 DRF框架是建立在Django框架基础之上,由Tom Christie大牛二次开发的开源项目。...,__all__代表所有 fields = '__all__' model 指明该序列化器处理的数据字段从模型类BookInfo参考生成 fields 指明该序列化器包含模型类中的哪些字段...serializer_class 指明该视图在进行序列化或反序列化时使用的序列化器 3.2.3....default 我们在使用序列化和反序列化时使用的默认值 allow_null 表明该字段是否允许传入None,默认False help_text、label_text 可以理解为注释,在web直观显示的时候有一个显示信息...对字段进行验证,如 def validate_btitle(self,value): if 'django' not in value.lower(): raise
方法: get_queryset():获取此视图的对象列表.必须是可迭代或者可以使查询集.默认返回queryset属性.可以通过重写该方法实现动态过滤.让这种方式能够工作的关键点,在于当类视图被调用时...参数,如果找到了这个参数,该方法使用这个参数的值执行一个基于逐渐的查询.如果这个参数没有找到,该方法查找slug_url_kwarg参数,使用slug_field字段执行针对slug的查询.当query_pk_and_slug...方法: get_success_url():决定在表单成功验证后重定向到的URL,默认返回success_url. form_valid(form):在表单验证成功后调用该方法(注意并没有对数据进行操作...,并重定向到get_success_url(),可以覆盖该方法在以上行为之间添加额外的动作.该方法必须返回一个HttpResponse. form_invalid(form):如果表单验证失败,则使用已填充的表单数据和错误信息重新渲染上下文...这种方式一般用于form需要更加精准的样式的时候,逐个元素逐个元素的编排到html中。 完成后可在页面上新增或修改项目信息。
1.jwt的安装配置 . 1.1安装JWT pip install djangorestframework-jwt==1.11.0 1.2 settings.py配置jwt载荷中的有效期设置 # jwt...载荷中的有效期设置 JWT_AUTH = { # 1.token前缀:headers中 Authorization 值的前缀 'JWT_AUTH_HEADER_PREFIX': 'JWT...'UNAUTHENTICATED_USER': 'django.contrib.auth.models.AnonymousUser', # 未认证用户使用的Token值 'UNAUTHENTICATED_TOKEN...JWT_AUTH = { # 1.token前缀:headers中 Authorization 值的前缀 'JWT_AUTH_HEADER_PREFIX': 'JWT', #...= requset.data.get('phone') email = requset.data.get('email') address = requset.data.get
其中该方法必须重写,如不重写其中没有认证逻辑,则直接抛出异常。 为方便管理,认证类写在新建的.py文件中。...2.3 drf内置的权限类 drf为我们内置了几个权限类,当我们的的需求类似时,可以直接使用其内置的权限类,避免代码冗余。...这几个权限类依次是 IsAdminUser 校验Django自带用户表中的is_staff字段,判断认证用户是否是管理员(注意:其判断的不是is_superuser字段,而是is_staff,即该用户是职员状态是就可以通过权限认证...,必须在频率类中对该属性进行赋值,且与sttings中要一一对应。...如果登录用户经过了认证,则限制的依据是该用户的user_id,否则就是该请求的ip地址。setting中的scope为user 。
方便我们以后使用离线文件可以自己去官网下载,也可以拿我这里已经下载好的,我将其放在网盘中,需要可自行下载,其中包含: js、bootstrap、font-awesome【图标】 链接:https://pan.baidu.com...但是,对于添加 form-control 属性,之后的代码中其他字段都要用到,每次使用for 循环添加很显然有些赘余,我们可以将其封装在一个类中,这样,需要添加样式的时候直接继承这个类就可以了。...// Django ModelForm 默认生成字段ID为 “id_ + 字段名” var mobilePhone = $('#id_mobile_phone').val...,我们应该将其放置在 local_settings.py 文件中( local_settings.py 文件的作用,我在上一篇文章中提到过),同时要在 settings.py 文件中声明import os...redis数据库中,且超时时间为 60s【即60s后自动消失】,这样我们在提交表单的时候,就可以将用户输入的验证码同redis中存的进行比较,且如果时间超过 60s,用户就要重新获取验证码 - redis
去处理 # 2)判断处理的结果(返回值)response,有值代表drf已经处理了,None代表需要自己处理 # 自定义异常处理文件exception,在文件中书写exception_handler函数...sex为选填字段 # 五个字段都必须提供完成的校验规则 # 局部钩子:validate_要校验的字段名(self, 当前要校验字段的值) # 校验规则:校验通过返回原值,校验失败...可以将值取出校验 # # 3)为有联合关系的字段们提供全局钩子函数,如果某些字段不入库,可以将值取出校验 # # 4)重写create方法,完成校验通过的数据入库工作,得到新增的对象...字段,不需要返回的就不用设置了 2)设置方法字段,字段名可以随意,字段值有 get_字段名 提供,来完成一些需要处理在返回的数据 view: 1)从数据库中将要序列化给前台的...,设置校验规则 2)为需要额外校验的字段提供局部钩子函数,如果该字段不入库,且不参与全局钩子校验,可以将值取出校验 3)为有联合关系的字段们提供全局钩子函数,如果某些字段不入库
这个应用支持多种认证体系,比如用户名或电子邮件。一旦用户注册成功,它还可以提供从无需认证到电子邮件认证的多种账户验证的策略。同时,它也支持多种社交账户和电子邮件账户。...Celery 用来管理异步、分布式的消息作业队列,可用于生产系统来处理百万级别的任务。 django-celery是django web开发中执行异步任务或定时任务的最佳选择。...Django REST 框架 构建REST API的优秀框架,可管理内容协商、序列化、分页等,开发者可以在浏览器中浏览构建的API。 ...pip install django_compressor 13. Reversion 为模型提供版本控制功能,稍微配置后,就可以恢复已经删除的模型或回滚到模型历史中的任何一点。.../django-notifications-hq/ 27.django-simple-captcha 简介:配合 django 的表单模块,方便地为表单添加一个验证码字段。
领取专属 10元无门槛券
手把手带您无忧上云