栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Python

Django项目管理

Python 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Django项目管理

一、redis通用命令

redis默认有16个 数据库(0-15) select 3 切换到数据库3

info 查看redis服务的信息 info replication查看主从复制的状况

keys * 查看所有的key, 生产环境中不使用 可能阻塞redis

查看key的数据类型 type key1

key 是否存在 exists key1

删除一个key del key1

重命名 rename key key1

flushdb # 清空当前数据库

flushall # 清空所有数据库

二、git 常用命令

1.初始化仓库:git init

2.查看状态:git status

3.添加文件:git add 文件名(*指的是全部)

4.配置个人信息:

git config user.name 你的名字

git config user.email 你的邮箱

5.提交代码:git commit -m 版本信息

6.查看日志信息:git log --oneline

7.回退:git reset --hard HEAD/版本号

8.关联远程仓库:git remote add origin ‘码云地址’

9.提交代码到远程仓库:git push -u origin "master"

10.获取远程仓库的代码:git pull origin master

11.分支操作:

#查看分支 git branch

#创建分支 git branch b1

#切换到b1分支 git switch b1

#将b1分支合并到master git switch master git merge b1

三、django,vue前后端注册代码

1.手机号跟用户名判断是否重复

from django.shortcuts import render
from rest_framework.views import APIView
from rest_framework.response import Response
import re
from user.models import User
# Create your views here.

# 用户名
class CheckUsername(APIView):
    def get(self,request,username):
        # 1.判断用户名格式
        # 要求字母开头,中间为字母,数字,下划线,长度5-16
        if not re.findall(r'^[a-zA-Z]w{4,15}$',username):
            return Response({
                'code':404,
                'msg':'用户名格式不正确'
            })
        # 2.判断用户是否存在
        if User.objects.filter(username=username):
            return Response({'msg':'用户名重复','code':400})
        else:
            return Response({'msg':'ok','code':200})

# 手机号
class MobileAPIView(APIView):
    def get(self,request,mobile):
        # 1. 判断手机号格式是否满足要求
        if not re.findall(r'^1[3-9]d{9}$',mobile):
            return Response({
                'msg':'手机号格式不正确',
                'code':404
            })
        # 2. 判断手机号是否存在
        if User.objects.filter(mobile=mobile):
            return Response({
                'msg':'手机号重复',
                'code':400
            })
        else:
            return Response({
                'msg':'ok',
                'code':200
            })

2.前端用户名手机号,判断密码是否一致请求

 // 用户名的校验方法
    let validateName = (rule, value, callback) => {
      if (!value) {
        return callback(new Error("用户名不能为空"));
      }
      // 用户名以字母开头,长度在5-16之间,允许字母数字下划线
      const userNameRule = /^[a-zA-Z][a-zA-Z0-9_]{4,15}$/;
      if (userNameRule.test(value)) {
        // 前端校验,用户名复合规则
        //请求后端, 判断用户名是否重复
        this.$axios
          .get("/users/check/username/" + value + "/"
          )
          .then((res) => {
            // 200代表用户名不重复,可以注册
            console.log("校验用户名是否重复:", res);
            if (res.data.code == 200) {
              this.$refs.ruleForm.validateField("checkPass");
              return callback();
            } else {
              // 用户名重复或者不符合规则
              return callback(new Error(res.data.msg));
            }
          })
          .catch((err) => {
            return Promise.reject(err);
          });
      } else {
        // 前端校验,用户名不符合规则
        return callback(new Error("字母开头,长度5-16之间,允许字母数字下划线"));
      }
    };


    // 手机号的校验方法
    let validateMobile = (rule, value, callback) => {
      if (value === "") {
        return callback(new Error("请输入手机号"));
      }
      // 手机号以1开头,第二位3-9之间的数字,长度为11,只允许数字
      const mobileRule = /^1[3-9]d{9}$/;
      if (mobileRule.test(value)) {
        this.$axios.get("/users/check/mobile/" + this.RegisterUser.mobile + "/")
        .then(res=>{
          console.log("验证手机号是否可用:", res)
          if(res.data.code == 200){
            this.$refs.ruleForm.validateField("checkPass");
            return callback();
          }else{
            return callback(new Error(res.data.msg))
          }
        }).catch(err=>{
          return Promise.reject(err)
        })
      } else {
        return callback(new Error("手机号不符合格式"));
      }
    };


    // 密码的校验方法
    let validatePass = (rule, value, callback) => {
      if (value === "") {
        return callback(new Error("请输入密码"));
      }

      // 密码以字母开头,长度在6-18之间,允许字母数字和下划线
      const passwordRule = /^[a-zA-Z]w{5,17}$/;
      if (passwordRule.test(value)) {
        this.$refs.ruleForm.validateField("checkPass");
        return callback();
      } else {
        return callback(
          new Error("字母开头,长度6-18之间,允许字母数字和下划线")
        );
      }
    };


    // 确认密码的校验方法
    let validateConfirmPass = (rule, value, callback) => {
      if (value === "") {
        return callback(new Error("请输入确认密码"));
      }

      // 校验是否以密码一致
      if (this.RegisterUser.pass != "" && value === this.RegisterUser.pass) {
        this.$refs.ruleForm.validateField("checkPass");
        return callback();
      } else {
        return callback(new Error("两次输入的密码不一致"));
      }
    };

3.django后端实现图形验证码及注册功能

# 图形验证码
class ImgCode(APIView):
    def get(self,request,uuid):
        # 1.生成4位验证码
        # string.ascii_letters 随机字母 a-zA-Z
        # string.digits 随机数字 0-9
        code = ''.join(random.sample(string.ascii_letters+string.digits,4))
        # 2.生成图形验证码
        cap = ImageCaptcha() # 定义对象
        img_code = cap.generate(code) # 生成图形验证码 de 图片
        # 3.保存验证码
        r = redis.Redis(host='localhost',port=6379,password='password',db=0)
        r.set(uuid,code,ex=60)
        r.close()
        # 4.返回图形验证码,使用httpResponse返回,需要加上数据类型context_type
        return HttpResponse(img_code,content_type='image/png')

# 校验图形验证码
class CheckImageCode(APIView):
    def post(self,request):
        # 1.提取get参数中的uuid和验证码
        uuid = request.data.get('imageCodeID')
        img_code = request.data.get('imageCode')
        # 2.读取redis数据库中的验证码
        r = redis.Redis(host='localhost',password='password',port=6379,db=0)
        r_code = r.get(uuid).decode()
        if not r_code:
            return Response({
                'msg':'验证码过期',
                'code':204
            })
        # redis数据库中存的是二进制
        # lower()都转换为小写
        # decode()解码
        if img_code.lower() == r_code.lower():
            return Response({'msg':'ok','code':200})
        else:
            return Response({'msg':'验证码错误','code':404})

# 用户注册
class Register(APIView):
    def post(self,request):
        # 获取前端提交数据
        username = request.data.get('userName')
        pwd = request.data.get('pwd')
        mobile = request.data.get('mobile')
        aggree = request.data.get('aggree')

        # 2.判断数据是否齐全
        if not all([username,pwd,mobile]):
            return Response({
                'msg':'用户的注册信息不完整',
                'code':204
            })
        # 3.判断是否同意协议
        if not aggree:
            return Response({
                'msg':'用户未同意协议',
                'code':204
            })
        # 4.往数据库中保存数据 create_user是AbstractUser提供的注册方法,会对密码进行加密
        User.objects.create_user(username=username,password=pwd,mobile=mobile)
        return Response({'msg':'注册成功','code':200})

4.vue前端实现图形验证码及用户注册

 // 校验图片验证码
    let validateImageCode = (rule, value, callback) => {
      if (value === "") {
        return callback(new Error("请输入图片验证码"));
      }
      // 图片验证码是由字母、数字组成,长度为4
      const iamgeCodeRule = /^[a-zA-Z0-9]{4}$/;
      if (iamgeCodeRule.test(value)) {
        this.$axios.post("/users/check_image_code/", {imageCode:this.RegisterUser.imageCode,imageCodeID:this.imageCodeID})
        // this.$axios.post("/users/test/", {username:'laufing1', password:"laufing123",mobile:123})
        .then(res => {
          if(res.data.code == 200){
            this.$refs.ruleForm.validateField("checkPass");
            return callback();
          }else{
            return callback(new Error(res.data.msg))
          }
        }).catch(err => {
          return Promise.reject(err)
        })
      } else {
        return callback(new Error("图片验证码不正确!"));
      }
    };
    // 用户注册
    Register() {
      // 是否同意用户协议
      if(!this.aggree){
        this.flag = true
        return
      }
      // 已勾选,则不显示提示信息
      this.flag = false
      // 通过element自定义表单校验规则,校验用户输入的用户信息
      this.$refs["ruleForm"].validate((valid) => {
        //如果通过校验开始注册
        if (valid) {
          this.$axios
            .post("/users/register/", {
              userName: this.RegisterUser.name,
              pwd: this.RegisterUser.pass,
              mobile: this.RegisterUser.mobile,
              aggree: this.aggree,
            })
            .then((res) => {
              // 200代表注册成功,其他的均为失败
              if (res.data.code == 200) {
                // 隐藏注册组件
                this.isRegister = false;
                // 弹出通知框提示注册成功信息
                this.notifySucceed(res.data.msg);
              } else {
                // 弹出通知框提示注册失败信息
                this.notifyError(res.data.msg);
              }
            })
            .catch((err) => {
              return Promise.reject(err);
            });
        } else {
          return false;
        }
      });
    },
 四、登录及退出登录
from django.db.models import Q
# 用户登录
class Login(APIView):
    def post(self,request):
        username = request.data.get('username')
        pwd = request.data.get('password')
        try:
            user = User.objects.get(Q(username=username)|Q(mobile=username))
        except Exception as e:
            print(e)
            return Response({
                'msg': '用户名不存在',
                'code': 204
            })
        if not user.check_password(pwd):
            return Response({
                'msg':'用户名或密码不正确',
                'code':204
            })
        token = generate_jwt_token(user)
        return Response({
                'msg':'登录成功',
                'code':200,
                'user':{
                    'username':user.username,
                    'uid':user.id
                },
                'token':token,
            })
    
# jwt token
def generate_jwt_token(user):
    payload = {
        'id':user.id,
        'username':user.username,
        'mobile':user.mobile,
        'exp':datetime.datetime.now() + datetime.timedelta(seconds=300)
    }
    # 进行加密,生成 jwt token
    token = jwt.encode(payload=payload,key=settings.SECRET_KEY,algorithm='HS256')
    # 返回token
    return  token
// 退出登录
    logout() {
      // 不显示退出登录框
      this.visible = false;

      this.$axios.get("/users/exit/").then((res) => {
        console.log("@@退出登录的响应:", res);

        if (res.data.code == 200) {
          // 清空本地登录信息
          // localStorage.setItem("user", "");
          localStorage.removeItem("user");
          localStorage.removeItem("token")

          // 清空vuex登录信息
          this.setUser("");
          this.notifySucceed("成功退出登录");
        } else {
          console.log("退出请求失败")
        }
      }).catch(err => {
        return Promise.reject(err)
      })
    },
 // 点击登录触发
    Login() {
      // 通过element自定义表单校验规则,校验用户输入的用户信息
      this.$refs["ruleForm"].validate(valid => {
        //如果通过校验开始登录
        if (valid) {

          // 发送ajax
          this.$axios.post("/users/login/", {
              user: this.LoginUser.name,
              pwd: this.LoginUser.pass,
              // withCredentials: true,
            })
            .then(res => {
              console.log("@@登录的响应:", res)
              // 200代表登录成功,其他的均为失败
              if (res.data.code == 200) {
                // res.data为后端响应的json
                // 隐藏登录组件
                this.isLogin = false;
                // 登录信息存到本地缓存
                let user = JSON.stringify(res.data.user);
                console.log("@@user", user)
                //要求后台返回什么样的数据?
                //{
                //     "code":200, 
                //     'msg': "欢迎user",
                //     "user":{
                //       userName:"xxx",
                //     },
                //
                //}
                // 前端存储用户信息,表示登录成功
                localStorage.setItem("user", user);
                localStorage.setItem("token", res.data.token)
                // sessionStorage.setItem("")
                // 登录信息存到vuex,控制页面欢迎信息
                // console.log("@@res.data.user", res.data.user)
                this.setUser(res.data.user);
                // 弹出通知框提示登录成功信息
                this.notifySucceed(res.data.msg);
              } else {//响应不是200
                // 清空输入框的校验状态
                this.$refs["ruleForm"].resetFields();
                // 弹出通知框提示登录失败信息
                this.notifyError(res.data.msg);
              }
            })
            .catch(err => {
              console.log(err)
              return Promise.reject(err);
            });
        } else {//未通过用户校验
          return false;
        }
      });
    }

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/982153.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号