当前位置: 首页 > news >正文

做网站还是租用服务器网站的要素是什么

做网站还是租用服务器,网站的要素是什么,购物网站免费模板,python做网站效率补充 # 1 接口文档编写规范#xff1a;-1 描述-2 请求地址-3 请求方式-4 请求参数-headers-请求体-请求参数-5 请求编码格式-6 返回格式-示例-返回数据字段含义-其他#xff1a;-错误状态码-...-接口文档编写位置-写在文件中#xff1a;word#xff0c;md#xff0c;跟前…补充 # 1 接口文档编写规范-1 描述-2 请求地址-3 请求方式-4 请求参数-headers-请求体-请求参数-5 请求编码格式-6 返回格式-示例-返回数据字段含义-其他-错误状态码-...-接口文档编写位置-写在文件中wordmd跟前端共享-公司有接口文档平台-yapi-自研-第三方接口文档coreapidrf-yasg-自动生成---》访问项目地址 的 /doc 路径就能看到接口文档# 2 jwt-json web token的缩写web方向前后端认证的方式传统的认证方案使用session使用jwt后服务端不需要再存数据了数据都放在客户端-本质原理-jwt 分三段-头公司信息加密方式声明这是jwt-荷载数据用户信息用户id名字邮箱过期时间-签名前面量部分通过某个加密方式加密得到一个签名base64编码后拼接到最后-开发中签发登录登录成功后按照上面方式生成token串认证客户端携带token到后端使用原来的加密方式把第一段和第二段再做加密加密后跟传入的第三代比较如果一样说明传入的token可靠如果不一样说明数据被篡改伪造的不能信任程序不能继续往后走了---------------------------------------------------------------------------------- # 3 base64-加密算法-1 编码和解码不加密base64url编码和解码-2 摘要算法md5sha1 不能解开-3 对称加密desAES 能加密能解密加密和解密使用同样的秘钥-4 非对称加密 RSA 能加密能解密加密秘钥和解密秘钥是不同的公钥和私钥-编码和解码使用内置模块 ---------------------------------------------------------------------------------- # 4 django使用jwt-django-rest-framework-jwt有点老-djangorestframework-simplejwt新的# 5 快速使用-签发path(login/, obtain_jwt_token),-认证局部使用全局使用局部禁用authentication_classes [JSONWebTokenAuthentication,]permission_classes [IsAuthenticated]1 jwt自定义表签发 1.1 models.py from django.db import modelsfrom django.contrib.auth.models import AbstractUser# 继承AbstractUser 直接使用自动签发token# 纯自己写的用户表需要自己签发 class User(models.Model):username models.CharField(max_length32)password models.CharField(max_length32)email models.EmailField(max_length32)gender models.IntegerField(choices((1, 男), (2, 女), (0, 未知))) 1.2 视图 from django.shortcuts import renderfrom rest_framework.views import APIView from .models import User from rest_framework.response import Responsefrom rest_framework_jwt.settings import api_settings # drf的配置文件# from rest_framework_jwt.utils import jwt_payload_handler jwt_payload_handler api_settings.JWT_PAYLOAD_HANDLER # rest_framework_jwt.utils.jwt_encode_handler jwt_encode_handler api_settings.JWT_ENCODE_HANDLERclass UserView(APIView):def post(self, request):username request.data.get(username)password request.data.get(password)user User.objects.filter(usernameusername, passwordpassword).first()if user:# 签发token# 1 通过user生成payload---》jwt 提供一个方法username传入user返回payload# payload jwt_payload_handler(user)payload{username:asdfasdf,exp:1694401763}# 2 生成token---》jwt提供了方法把payload放入--》tokentoken jwt_encode_handler(payload)return Response({code: 101, msg: 登录成功, token: token, username: user.username})else:return Response({code: 101, msg: 用户名或密码错误}) 1.3 路由 path(login/, UserView.as_view()),2 jwt 多方式登录(auth的user表) #1 用户名密码 邮箱密码 手机号密码 都可以登录usernamepasswordemailpasswordphonepassword无论是usernameemailphone都以 username形式提交到后端于是从username字段中取出来的可能是用户名可能是邮箱可能是密码---》都能登录成功 #2 auth的user签发 #3 签发校验用户 逻辑-----》放在序列化类中# 5 存在一个问题---》已经迁移过表了---》已经存在auth的user表了如果再去继承AbstractUser再写用户表就会出错-解决方案以后尽量不要这么做-以后要扩写auth的user表一开始就要扩写不要等迁移完之后再扩写-删库-删迁移文件不要删__init__.py和migrations文件夹-项目app的迁移文件-django内置app的admin和auth的迁移文件-重新迁移--两条命令-扩写auth的user表需要在配置文件配置 ###重要# 6 创建超级用户---创建到扩写的表 auth的user--》AuthUserpython manage.py createsuperuser 2.1 总结流程 # 序列化反序列化数据校验---》只用来做数据校验 # 前端传过来的字段都要而且要校验 username password # 只要视图类中执行 ser.is_valid():会走字段自己的规则---》username过不了---》因为有unique---》所有需要重写会走局部钩子---》这里没写会走全局钩子---》全局钩子里校验-分成了两个方法:好处是以后修改方法-_get_user 多方式的 以后改成单方式登录只要该这个方法即可 -_get_token用的第三方签发后期改成自己的签发只需要改它即可-把生成的token和用户名放到了序列化类中单是怕污染数据放到了序列化类的对象的context中# 视图类中取出token和usernametoken ser.context.get(token)username ser.context.get(username)2.2 序列化类 from .models import AuthUser from rest_framework import serializers import re from rest_framework.exceptions import ValidationError from rest_framework_jwt.settings import api_settings # drf的配置文件# from rest_framework_jwt.utils import jwt_payload_handler jwt_payload_handler api_settings.JWT_PAYLOAD_HANDLER # rest_framework_jwt.utils.jwt_encode_handler jwt_encode_handler api_settings.JWT_ENCODE_HANDLER# 序列化类干什么 只用来反序列化的校验 class LoginSerializer(serializers.ModelSerializer):# username 是表中的字段---》自动映射过来的--A user with that username already exists# username有字段自己的规则---》唯一 unique---》去数据库查询发现有lqz之间字段自己规则报错了不会走到全局钩子usernameserializers.CharField() # 需要重写字段不重写字段自己规则过不了class Meta:model AuthUser # 千万不要加逗号,程序运行不会报错使用这个地方的时候就报错了fields [username, password]# 在类内部 用 __ 开头表示隐藏# 我们约定俗称以 _ 开头的表示只在类内部使用不给外部用但是万一外部要用之间用既可以了def _get_user(self, attrs):# 用户名从哪拿 attrs是前端传入校验过后的数据 {username: lqz,password: lqz12345 }username attrs.get(username)password attrs.get(password)if re.match(r^1[3-9][0-9]{9}$, username): # 说明用户提交的是手机号密码user AuthUser.objects.filter(phoneusername).first()elif re.match(r^..$, username): # 这个邮箱正则不太准确 如果是邮箱说明用户提交的是 邮箱密码user AuthUser.objects.filter(emailusername).first()else:user AuthUser.objects.filter(usernameusername).first()if user and user.check_password(password):return userelse:# 在全局钩子中只要校验不通过就抛异常# 不是returnraise ValidationError(用户名或密码错误)def _get_token(self, user):payload jwt_payload_handler(user)token jwt_encode_handler(payload)return tokendef validate(self, attrs):# 1 校验用户user self._get_user(attrs) # 如果返回user说明用户名密码对了如果没走到这里说明抛异常抛异常说明用户名密码错误# 2签发tokentoken self._get_token(user)# 3 放在这里面 self 是序列化类的对象 ,context 是空字典它是 视图类和序列化类之间沟通的桥梁self.context[token] tokenself.context[username] user.username# 4 返回校验过后的数据return attrs 2.3 视图类 ## 2.基于auth的user表签发token做多种方式登录 用户名密码 邮箱密码 手机号密码 都可以登录usernamepasswordemailpasswordphonepassword无论是usernameemailphone都以 username形式提交到后端于是从username字段中取出来的可能是用户名可能是邮箱可能是密码---》都能登录成功from rest_framework.viewsets import ViewSet, GenericViewSet from rest_framework.decorators import action import refrom .serializer import LoginSerializer from .models import AuthUserclass UserView(GenericViewSet):# 不需要做序列化或者反序列化则可以不用写queryset# queryset serializer_class LoginSerializeraction(methods[POST], detailFalse)def login(self, request, *args, **kwargs):username request.data.get(username)password request.data.get(password)# 正则匹配如果是手机号要查手机号密码如果是邮箱要查邮箱密码如果是其他则查用户密码if re.match(r^1[3-9][0-9]{9}$, username):user AuthUser.objects.filter(phoneusername).first()elif re.match(r^..$, username):user AuthUser.objects.filter(emailusername).first()else:user AuthUser.objects.filter(usernameusername).first()if user and user.check_password(password):# 签发payload jwt_payload_handler(user)token jwt_encode_handler(payload)return Response({code: 100, msg: 登录成功, token: token, username: username})return Response({code: 101, msg: 用户名或密码错误})-------------------优化版---------------------------------------------------- from rest_framework_jwt.views import obtain_jwt_token ## 复杂方式---》校验逻辑--》放在序列化类中 class UserView(GenericViewSet):# queryset 可以不写serializer_class LoginSerializeraction(methods[POST], detailFalse)def login(self, request, *args, **kwargs):# 拿到前端传入的用户名和密码得到一个序列化类对象ser self.get_serializer(datarequest.data)if ser.is_valid(): # 字段自己校验不过因为username在数据库中有你传入的这个名字了局部钩子全局钩子---》需要在序列化类中写# 校验完并且签发完token了# token从 序列化类的对象 取出来# username从 序列化类的对象 取出来# 现在不明白如何取出来的假设取出来是对的---》因为在全局钩子中放入到了context中token ser.context.get(token)username ser.context.get(username)return Response({code: 100, msg: 登录成功, token: token, username: username})else:return Response({code: 101, msg:用户名密码错误}) 2.4 路由 from django.contrib import admin from django.urls import path from app01.views import UserView from rest_framework.routers import SimpleRouterrouter SimpleRouter() router.register(user, UserView, user) # 127.0.0.1:8000/user/login 的post请求 urlpatterns [path(admin/, admin.site.urls),# path(login/, UserView.as_view()), ] urlpatterns router.urls
http://www.pierceye.com/news/661320/

相关文章:

  • 机械设备网站源码中国神鹰网站建设
  • access 网站源码安阳市地图
  • 临沂房产和房建设局网站双和关键词排名怎么查
  • 建网站多少费用301不同类型网站
  • 深圳seo网站排名优化贵州省都匀市网站建设
  • 个人网站风格设计做网站时需要注意什么问题
  • 时装网站建设的背景软装设计费用
  • 排名轻松seo 网站国内开源平台
  • 常德做网站公司哪家好雷达图 做图网站
  • 做网站的环境配置wordpress手机版本
  • 市场网站建设济南智能网站建设
  • 淄博网站的优化大数据开发过程
  • 德阳网站建设公司做抢单软件的网站
  • 金融类的网站怎么做地方门户网站建设多少钱
  • 网站建设周末培训长春网站建设服务
  • 网站宝建站助手呼市地区做网站公司
  • 网站开发需要用到哪些设备建立网站得多少钱
  • 广州最好网站策划外网网站有什么好的推荐
  • 企业营销型企业网站建设cpa推广联盟平台
  • 南山区公司网站制作网站建设都 包括哪些
  • 域名备案网站建设方案公司网站设计怎么做
  • wordpress网站地图生成插件门户网站管理流程
  • 网站设计工程师培训关键词排名优化公司外包
  • 做电影资源网站手机版交通运输部: 优化交通运输领域防控
  • 找人做微信网站无锡响应式网站
  • 温州手机网站制作联系电话装修公司加盟条件
  • 网站后台模板html5淄博桓台网站建设公司
  • 开发app和网站的公司网站开发项目流程图模板
  • 深圳优秀网站建设品牌策略
  • 上海市建设机械行业协会网站石家庄最新招聘