当前位置:网站首页>项目登录注册思路
项目登录注册思路
2022-07-27 05:02:00 【Csdn__F】
redis
主要知识点
string类型的增删改查
用途:验证码存储uuid和验证码文本对应关系
增: set
删 del set设置ex 秒数
改 set
查 get
list类型的增删改查
历史记录
增: lpush rpush
删 del 清空整个列表 lrem key count rem
改 不是重点 可以使用先删除,后添加
查 lrange key 0 -1
set 类型的增删改查
收藏
增: sadd
删 del 清空整个列表 srem key value
改 不需要改,没有删掉就可以了
查 smembers key
hash 类型的增删改查
购物车
增: hset key 键 值
删 del 清空整个列表 hdel key 键
改 hset key 键 值
查 hgetall
注册
前端
校验
在input上面,要绑定事件 和 数据 v-model
<input @blur="checkUser" v-model="username" /> 如果发现input怎么也输入不进去东西,v-model里面的东西,没有在data里面定义- @click=“函数名不加括号” 点击事件 提交注册的时候,提交登录的时候,一般在按钮上绑定
- @blur=“函数名” 失去焦点事件 一般是在input上面绑定。什么是失去焦点,就是光标从input里面移出来
在js的methods里面,定义一个函数,函数名就是事件里面写的函数名
data(){ return { "username":"", //如果不写这个,你input输入不进去东西 } } ,methods:{ 函数名(){ xxxx 函数体 // 想要获取到username var uname = this.username // 发送axios请求就可以了 } }
验证码
<img :src="img_path" @click="ver_img" /> 冒号不能少,里面给一个函数
import {
v4 as uuid4} from 'uuid'
data:{
img_path:"",
},
create(){
this.ver_img() # 页面加载完成以后,马上执行一下
},
methods:{
ver_img(){
uuid = uuid4() # 生成一个uuid
this.img_path = "/user/ver_img/" + uuid + "/"
}
}
注册
- 给button按钮绑定click事件,
- 实现函数,发送axios请求,post请求
- post要带参数,post(url,参数)
- 参数是一个字典格式 { “username”:this.username,“pwd”:this.password }
后端
校验
获取前台传过来的数据 get/post
- 一般上课的时候,我们用的get+动态路由,参数通过路由的方式传过来的
- get 传参,参数直接在url上面,request.query_params.get(),
- post传参,在request.data.get()里面
- 路由传参,接受的时候,def get(self,request,参数) 参数名字必须和 路由里面的名字一样。
进行校验
唯一性校验
- 去数据库查询这条数据
def get(self,request,uname): user_info = User.objects.filter(username=uname).first() if user_info: # 返回存在 else: # 如果后续还有判断,就不需要写else # 返回可用格式校验
- 定义正则 rule = r’’
- 正则匹配
- 导入re包 import re
- 匹配 返回值 = re.findall(正则的变量,要匹配字符串的变量)
- 判断返回值 如果为假,说明没有匹配上
- 根据是否匹配上,返回对应的提示
生成验证码
- 获取前台传过来的UUID ,说白了就是个字符串
- 生成一个4位的随机数,random.randint(1000,9999)
- 生成的随机数,不能直接用。因为是int类型,需要转换为string类型 str()
- 把随机数变成图片 captcha
- 还得把验证码和uuid的对应关系存在redis里面
# 导包
from captcha.image import ImageCaptcha
from django.http import HttpResopnse
def get(self,request,uuid):
# 代码不完整,只写了关键性的东西,不要直接复制
# 实例化验证码的类
img = ImageCaptcha()
# 生成,调用实例化对象的一个生成方法
img_byte = img.generate(随机字符串) #传进来的参数,一定是字符串类型的,如果不是,你需要str转换一下
# 存uuid和随机字符串的对应关系
r = redis.Redis(参数省略,根据自己条件添加)
r.set(uuid,随机字符串,ex=300)
# 返回图片的二进制,就不能用Response
return HttpResopnse(img_byte,content_type="image/png") # 这个函数,是django自带的的
验证码校验
- 获取前台传过来参数 uuid 和 code
- 根据uuid去redis数据库,查到对应的值 code_byte,返回值是一个byte类型,需要转换成string类型
- 链接redis redis.Redis(host=“127.0.0.1”,port=6379,password=“123456”)
- 把redis查到的,转换成string类型 code_str = code_byte.decode() # decode会飘黄,正常现象
- 判断数据库code_str 和用户输入的code是否一致
- 如果一致,验证通过,不一致,验证不通过
注册
- 获取前台传过来的数据 get/post
- request.data.get() 获取post
- 动态路由 获取get 定义了动态路由 那你 def get的时候,或者post 需要接收这个参数
- 可能遇到的错误:
- 前台传过来的参数名和你后端接受的参数名不一样,现象就是接受的参数打印出来以后,显示None,或者可能会报错。提示一个None上面没有xx属性,或者方法。解决:你获取完参数,马上就调试一下。
- 补充:错误解决:
- 404错误,找斜杠写了没,或者路由配置了没,或者单词打错了没
- 500错误, 参数获取了没,代码有没有飘红、黄。如果实在找不到就一个代码块地进行return Resopnse()
- 返回的逻辑错误,比如用户未登录、密码错误之类的,逻辑判断上出问题了。不一定是判断这条语句有问题,有可能是你判断的值,有没有获取到,或者说类型有问题。解决:你在if判断之前,把要判断的条件 print出来,看一眼。
- 对参数进行校验,讲课的时候省略了。因为在前输入的时候,就进行过一次校验。这里不代表不需要了,只是说,代码重复了,不再重写了。
- 最好判断一下用户名是否已经存在
- 写入数据库
- 模型.objects.create(关键词参数)
- 返回响应
- return Response() 注意导入包
登录
前端
后端
获取前台传过来的数据,用户名和密码
根据用户名,查询出来这条数据,如果这条数据压根就不存在,返回用户名或密码错误就可以了。
如果查询出来数据了,对比一下密码是否一致。 if username == user_info.password:
如果不一致,直接返回用户名或密码错误就可以了
如果一致,返回登录成功,光提示登录成功不够,还要用户的信息也一并返回
用户的基本信息,存在user里面返回,前台展示使用。 用户名、手机号。密码不能返回
用户的验证信息,你登录的凭证(付款小票)。JWT
生成很简单,就一行代码
# pip install pyjwt import jwt from django.conf import settings payload = { "user_id":user_info.id, "user_name":user_info.name, } token = jwt.encode(payload,settings.SECRET_KEY,al...="HS256") # 这一行代码是重点 # payload 其实就是用户信息,里面最好加一个user_id # 要使用settings ,要导包 from django.conf import settings return Resopnse({ "code":"", "msg":"", "user":payload, "token":token, })
边栏推荐
- Derivation and explanation of PBR physical illumination calculation formula
- 数据库连接池&&Druid使用
- Redis lock
- [CSAPP] Application of bit vectors | encoding and byte ordering
- Differences and examples between internal classes and static internal classes
- JVM Part 1: memory and garbage collection part 10 - runtime data area - direct memory
- String class
- Notes series k8s orchestration MySQL container - stateful container creation process
- redis持久化
- 商品图片的管理
猜你喜欢

Notes Series docker installation PostgreSQL 14

2021 OWASP top 6-10 collection

torch中乘法整理,*&torch.mul()&torch.mv()&torch.mm()&torch.dot()&@&torch.mutmal()

Flask请求数据获取与响应
![[CSAPP] Application of bit vectors | encoding and byte ordering](/img/96/344936abad90ea156533ff49e74f59.gif)
[CSAPP] Application of bit vectors | encoding and byte ordering

笔记系列之docker安装Postgresql 14

The receiver sets the concurrency and current limit

JVM Part 1: memory and garbage collection -- runtime data area 4 - program counter

JVM Part 1: memory and garbage collection part 10 - runtime data area - direct memory

简化JDBC的MyBits框架
随机推荐
Student management system
用pygame自己动手做一款游戏01
Li Hongyi machine learning team learning punch in activity day02 --- return
Derivation and explanation of PBR physical illumination calculation formula
Integrate SSM
Message reliability processing
JVM Part 1: memory and garbage collection part 7 -- runtime data area heap
Common commands in CONDA and pip environments
Bean的生命周期&&依赖注入*依赖自动装配
Redis transaction
During its low-level period, this slave edge causes the instruction number to make a corresponding model
B1025 reverse linked list*******
如何快速有效解决数据库连接失败问题
redis持久化
pytorch 数据类型 和 numpy 数据 相互转化
商品图片的管理
Localdatetime and zoneddatetime
Database design - relational data theory (ultra detailed)
redis事务
redis发布订阅模式