一、git学习回顾
首先在你的电脑上安装git软件
,公司搭建远程仓库用
- gitee
- gitlab
如何搭建:https://zhuanlan.zhihu.com/p/413217715
1、git介绍、安装
- 版本管理软件:代码的版本管理和协同开发【多人开发同一个项目,代码合并】
- 官网下载安装
2、git、gitlab、gitee、github
- git软件
- gitlab、gitee、github:远程仓库
3、svn和git的区别
- svn集中式管理:没有网络是没有服务的,版本管理就用不了
- git分布式管理:没有网络,没有远程仓库,做版本管理没有问题
4、git工作流程
- 工作区
- 暂存区
- 版本库
- 远程仓库
5、常用命令
- git init
- git add .
- git commit -m '注释'
- git status
- git log
- git reflog
设置用户邮箱和名字
- gitee远程仓库,你当时设置的邮箱如果跟gitee注册邮箱不一样,显示头像不一样
- gitee设置邮箱公开
6、git过滤文件
- 在仓库路径下创建:
.gitignore
在文件中配置忽略文件 - 文件名
- 文件夹名
- *.py
- *.p?
- /文件名
- /文件夹名
- 空文件夹不会被git管理
- 最开始没被版本管理之前就要忽略文件
7、git多分支
- master:主分支操作,只用来做发布版本
- master、dev、bug
- 分支创建
- 切换
- 查看
- 删除
- 合并
- 查看远程仓库和本地仓库的分支:git branch -a
8、远程仓库:gitee、gitlab
- 创建仓库 开源协议
- 把本地仓库代码,提交到远程仓库
- git remote add origin 地址
- git pull origin master
- git push origin master
9、ssh操作
- 生成公钥私钥
- 公钥配置在远程仓库
- 免密操作
10、协同开发
- 多个人同时开发一个项目
- 普通开发者:clone下来。。。
- 仓库创建者:本地提交上去——>加成员
11、冲突出现和解决
- 多人在同一分支开发
- 分支合并
12、线上分支合并
- 线下分支合并 merge
- 线上分支合并:提交申请:pr mr
13、pycharm操作git
- 所有的git操作都能通过“点点点”来实现
- add
- commit
- push
- pull
- 查看变化
14、为开源项目贡献代码
- 先fork项目,你仓库有,你改你的,提交pr
15、之前博客有的git面试题
二、路飞项目之首页中间部分样式
- 去
element官网
去找——卡片 - 开始调试:
:span
这个基础的是有24个分栏,看一下自己页面的布局 - 加一下图片中间的间距,在<el-col>标签里加入
class = course_detail
在下方添加一下样式 - 写个img标签 填一下下方的图片
代码展示
<template>
<div className="home">
<Header></Header>
<Banner></Banner>
<div className="course">
<el-row>
<el-col :span="6" v-for="(o, index) in 8" :key="o" class="course_detail">
<el-card :body-style="{ padding: '0px' }">
<img src="https://tva1.sinaimg.cn/large/e6c9d24egy1h1g0zd133mj20l20a875i.jpg"
className="image">
<div style="padding: 14px;">
<span>推荐课程</span>
<div className="bottom clearfix">
<time className="time">价格:666</time>
<el-button type="text" className="button">查看详情</el-button>
</div>
</div>
</el-card>
</el-col>
</el-row>
</div>
<img src="https://tva1.sinaimg.cn/large/e6c9d24egy1h1g112oiclj224l0u0jxl.jpg" alt="" width="100%" height="500px">
<Footer></Footer>
</div>
</template>
<script>
import Header from '@/components/Header'
import Banner from '@/components/Banner'
import Footer from '@/components/Footer'
export default {
name: 'HomeView',
data() {
return {}
},
components: {
Header, Banner, Footer
}
}
</script>
<style scoped>
.time {
font-size: 13px;
color: #999;
}
.bottom {
margin-top: 13px;
line-height: 12px;
}
.button {
padding: 0;
float: right;
}
.image {
width: 100%;
display: block;
}
.clearfix:before,
.clearfix:after {
display: table;
content: "";
}
.clearfix:after {
clear: both
}
.course_detail {
padding: 50px;
}
</style>
二、多方式登录接口
登录注册
- 多方式登录【用户名、邮箱、手机号+密码】
- 验证手机号是否存在
- 验证码登录
- 发送验证码
- 手机号注册接口
多方式登录
- {username:用户名、邮箱、手机号,password:666}——>post请求
- 之前写的逻辑,校验用户,是写在序列化类的方法中 就是request.data.get获取数据,然后查询用户,再返回。
- 今天把逻辑写序列化类中(两种写法一样逻辑没有变化:原来是在视图类中一路写到底,现在这种写法是视图类中代码少了就几行,逻辑都写在序列化类中可以理解为从上到下执行中间去了序列化类中执行一下再回来接着往下执行)
整体代码逻辑
- jwt登录也是这么写的,序列化类是序列化、反序列化、校验字段,然后把这一部分代码放进去一块执行了
- luffy_api后端views.py编写
- 写个
class_UserView写个def mul_login
这次写post是为了查询记录,路由注册好,发送post请求就能进来。继承viwset
自动生成路由然后用action装饰器做区分 - 创建
serializer.py
序列化,写个序列化类class UserMulLoginSerializer(serializers.ModelSerializer)
这个序列类,只用来做登录校验,不做序列化,不做反序列化。然后fields接收前端传过来的username和password,写了不传会报错不要写id。 - 加括号得到序列化类的对象,
ser.is_valid(raise_exception=True)
做校验,校验通过往下走,校验不通过直接抛异常,会执行:序列化类字段自己的校验规则,局部钩子,全局钩子 - 用户名校验通过后签发token,返回给前端
return APIResponse(token=token)
直接返回token就好,code和msg全局异常有 - 写全局异常
def valdate
为了做校验,1取出用户名和密码,校验用户是否存在2签发token3把token放到序列化对象中 - 写了_get_user _get_token写的是_ __表示隐藏_并不是隐藏 但是公司大部分 _表示在内部用,如果外部想用也可以调用
- 写_get_user方法取到的可能是用户名、邮箱、手机号,正则验证,写的简版全的去百度查去,然后做if判断有值就return user 没有抛异常raise ValidationError用户名或密码错误
- 签发token,首先用户得到payload,通过payload得到token,安全起见用try家except,然后return token
- 把token放到序列化对象里,需要注意字段污染,用context上下文views和序列化类都传到中间,避免一下。
- 把token username icon放进去
- 没有问题,返回attrs
- 路由分发,自动生成路由
小总结:
写一个手机号、用户名、邮箱都能登录,发post请求,这次后端把逻辑写在序列化类里,只要调用is_valid走自己的字段校验规则、局部钩子、全局钩子,执行序列化中validate,如果走完从序列化中取token、username、icon返回到前端登陆成功,走不完直接抛异常出去。
两个坑:
- 因为先走自己字段的规则,username里有个unique=True,这个是唯一的意思,到自己校验规则的时候去数据库里查这条记录在不在,如果在就符合要求报错了,是因为现在是登录功能传了username和password两个字段进来,username是映射进来的
username = serializer.Charfiled(unique=True)
去数据库里看这条记录有没有,因为你是登录数据库里当然有这条记录,所以你过不了!!!!直接抛异常!直接括号里删了不写username = serializer.Charfiled()
优先用现在的就没unique的限制 - 第二个坑icon是个文件对象,没法序列化,转成str字符串,因为转成字符串是个地址,缺了前面http://127.0.0.1:8000/media补上就行。
代码展示
视图类
from rest_framework.viewsets import ViewSet, GenericViewSet, ViewSetMixin
from rest_framework.decorators import action
from .models import UserInfo
from .serializer import UserMulLoginSerializer
from utils.response import APIResponse
class UserView(ViewSet):
@action(methods=['POST'], detail=False)
def mul_login(self, request):
# 1 老写法
# username=request.data.get('username')
# password=request.data.get('password')
# # 查询用户,
# UserInfo.objects.filter(username=username,password=password)
# # 签发token
# # 返回
# 2 新写法:使用序列化类
ser = UserMulLoginSerializer(data=request.data)
# jwt 模块的登录就是这么写的
ser.is_valid(raise_exception=True) # 会执行:序列化类字段自己的校验规则,局部钩子,全局钩子
# 用户名密码校验通过了,在序列化类中--》签发token
token = ser.context.get('token')
username = ser.context.get('username')
icon = ser.context.get('icon') # icon是个对象 字符串
return APIResponse(token=token, username=username,
icon=icon) # 前端看到的样子{code:100,msg:成功,token:adsfa,username:root,icon:http://adsfasd.png}
序列化类
from rest_framework import serializers
from .models import UserInfo
import re
from django.contrib.auth import authenticate
from rest_framework.exceptions import ValidationError
from rest_framework_jwt.settings import api_settings
jwt_payload_handler = api_settings.JWT_PAYLOAD_HANDLER
jwt_encode_handler = api_settings.JWT_ENCODE_HANDLER
# 这个序列类,只用来做登录校验,不做序列化,不做反序列化
class UserMulLoginSerializer(serializers.ModelSerializer):
username = serializers.CharField() # 重写,优先用现在的,就没有unique的限制了
class Meta:
model = UserInfo
fields = ['username', 'password']
# 封装之隐藏属性 __表示隐藏, _并不是隐藏,公司里约定俗成用 _ 表示只在内部用,如果外部想用,也可以用
def _get_user(self, attrs):
# attrs 是校验过后的数据:字段自己的规则【字段自己有规则:坑】和局部钩子
username = attrs.get('username')
password = attrs.get('password')
# username可能是用户名,邮箱,手机号---》使用正则判断
if re.match(r'^1[3-9][0-9]{9}$', username):
user = authenticate(mobile=username, password=password)
elif re.match(r'^.+@.+$', username): # adsa@adsf 会有bug,用户名中如果有@,登录不了了
user = authenticate(email=username, password=password)
else:
user = authenticate(username=username, password=password)
if user:
return user
else:
raise ValidationError('用户名或密码错误')
def _get_token(self, user):
try:
payload = jwt_payload_handler(user)
token = jwt_encode_handler(payload)
return token
except Exception as e:
raise ValidationError(str(e))
# 还要写别的
def validate(self, attrs):
# 1 取出用户名和密码,校验用户是否存在
user = self._get_user(attrs)
# 2 签发token
token = self._get_token(user)
# 3 把token放到序列化类对象中
self.context['token'] = token
self.context['username'] = user.username
self.context['icon'] = 'http://127.0.0.1:8000/media/'+str(user.icon) # 这是个对象,可能会有问题
# self.context['icon'] = user.icon # 这是个对象,可能会有问题
# 以后如果有问题,都抛异常
# 如没有问题,返回attrs
return attrs
路由
from django.contrib import admin
from django.urls import path, re_path
from home import views
from django.views.static import serve
from django.conf import settings
from . import views
from rest_framework.routers import SimpleRouter
router = SimpleRouter()
# 127.0.0.1:8080/api/v1/userinfo/user/mul_login
router.register('user', views.UserView, 'user')
urlpatterns = [
]
urlpatterns += router.urls
三、手机号是否存在接口
get请求: 127.0.0.1:8080/api/v1/userinfo/user/mobile/?mobile=11122223333
代码逻辑
- 写个def mobile,用action封一下,get请求
- 从地址栏query_params里取
- Userinfo校验 通过return APIResponse 不通过APIException抛异常
代码展示
class UserView(ViewSet):
@action(methods=['GET'], detail=False)
def mobile(self, request):
try:
mobile = request.query_params.get('mobile')
UserInfo.objects.get(mobile=mobile) # 有且只有一个才不报错,
return APIResponse(msg='手机号存在') # {code:100,msg:手机号存在}
except Exception as e:
raise APIException('手机号不存在') # {code:999,msg:手机号不存在}
四、腾讯云短信介绍和申请
# 咱们要写发送短信接口,我们要发短信,借助于短信运营商
# 腾讯云开放平台,有很多开放的接口供咱们使用,咱们用的是短信
-注册平台---》找到短信
-https://console.cloud.tencent.com/smsv2
# 申请使用腾讯云短信:
1 创建签名:使用公众号申请
-网站:备案:工信部备案
-申请个人一个公众号:
-https://mp.weixin.qq.com/
-等审核通过
2 申请模板:发送短信的模板 {1} {2} 后期用代码填上
3 免费赠送100条
4 代码发送短信:参照文档写代码:https://cloud.tencent.com/document/product/382/13444
-v2 老一些
-v3 最新
什么是api,什么是sdk
# API文档
-之前学的接口文档的概念
-使用api调用,比较麻烦,固定输入,接受固定的返回
-使用postman都可以测试,携带你的认证的秘钥。
# SDK:Software Development Kit 软件开发工具包
-分语言的
-基于API,使用某个编程语言封装的包
-例如python:pip install 包
-包.发短信(参数)
-一般厂商都会提供各大主流语言的sdk
# 腾讯短信sdk使用步骤
1 已开通短信服务,创建签名和模板并通过审核 # 开了
2 如需发送国内短信,需要先 购买国内短信套餐包。 #赠送了
3 已准备依赖环境:Python 2.7 - 3.6 版本。 #我们有
4 已在访问管理控制台 >API密钥管理页面获取 SecretID 和 SecretKey。
SecretID 用于标识 API 调用者的身份。
SecretKey 用于加密签名字符串和服务器端验证签名字符串的密钥,SecretKey 需妥善保管
5 短信的调用地址为sms.tencentcloudapi.com。
五、面试题:http和https的区别
HTTP协议以明文方式发送内容,不提供任何方式的数据加密。HTTP协议不适合传输一些敏感信息,比如:信用卡号、密码等支付信息。
https则是具有安全性的ssl加密传输协议。
http和https使用的是完全不同的连接方式,用的端口也不一样,前者是80,后者是443。并且https协议需要到ca申请证书。
HTTPS协议是由SSL+HTTP协议构建的可进行加密传输、身份认证的网络协议,要比http协议安全。
标签:username,git,06,学习,token,user,luffy,import,序列化
From: https://www.cnblogs.com/zzjjpp/p/16877421.html