django rest framework 学习笔记-实战商城

 01项目环境搭建_哔哩哔哩_bilibili  本博客借鉴至大佬的视频学习笔记


# 创建项目
django-admin startproject MyShop

# 创建app
E:\desktop\my_drf\MyShop>django-admin startapp goods

E:\desktop\my_drf\MyShop>django-admin startapp order

E:\desktop\my_drf\MyShop>django-admin startapp cart

E:\desktop\my_drf\MyShop>django-admin startapp users

创建apps文件夹放入的上面应用

# 注册应用
'rest_framework',
'corsheaders',
'apps.users',
'apps.goods',
'apps.cart',
'apps.order'

# 配置mysql
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'shop',
        'USER': 'root',
        'PASSWORD': 'pass',
        'HOST': 'localhost',
        'PORT': 3306
    }
}

# 允许所有的用户跨域请求
CORS_ORIGIN_ALLOW_ALL = True

# 中文及时区调整
LANGUAGE_CODE = 'zh-hans'

TIME_ZONE = 'Asia/Shanghai'


 创建shop数据库

mysql> create database shop charset=utf8;
Query OK, 1 row affected, 1 warning (0.01 sec)

 公共表设计:

# 定义继承时,需要setting自定义用户类模型
AUTH_USER_MODEL = 'users.User'
# 创建 common目录下db.py文件
from django.db import models

class BaseModel(models.Model):
    """ 抽象的模型基类,定义公共模型字段 """

    create_time = models.DateTimeField(auto_now_add=True,verbose_name='创建时间')
    update_time = models.DateTimeField(auto_now=True,verbose_name='更新时间')
    is_delete = models.BooleanField(default=False,verbose_name='删除标记')

    class Meta:
        # 声明这个是抽象模型,生成迁移文件时,不会在数据库生成表
        abstract = True
        verbose_name_plural = '公共字段表'
        db_table = 'BaseTabel'

用户表结构设计

from django.db import models
from django.contrib.auth.models import AbstractUser  # django自带的用户认证模型
from common.db import BaseModel
# Create your models here.

class User(AbstractUser,BaseModel):
    """用户表"""
    mobile = models.CharField(verbose_name='手机号',help_text='手机号',max_length=11,default='',blank=True)
    avatar = models.ImageField(verbose_name='用户头像',help_text='用户头像',max_length=30,null=True,blank=True)

    class Meta:
        db_table = 'users'
        verbose_name = '用户表'

class Addr(models.Model):
    """收货地址模型"""
    user = models.ForeignKey('User',verbose_name='所属用户',on_delete=models.CASCADE)
    phone = models.CharField(verbose_name='手机号',help_text='手机号',max_length=11,null=True,blank=True)
    name = models.CharField(verbose_name='联系人',help_text='联系人',max_length=20,null=True,blank=True)
    province = models.CharField(verbose_name='省份',help_text='省份',max_length=20,null=True,blank=True)
    city = models.CharField(verbose_name='城市',help_text='城市',max_length=20,null=True,blank=True)
    country = models.CharField(verbose_name='区县',help_text='区县',max_length=20,null=True,blank=True)
    is_default = models.BooleanField(verbose_name='是否为默认地址',help_text='省份',max_length=30,default=False)

    class Meta:
        db_table = 'addr'
        verbose_name = '收货地址表'

class Area(models.Model):
    """省市区县地址模型"""
    pid = models.ImageField(verbose_name='上级ID',help_text='上级ID',max_length=20,null=True,blank=True)
    name = models.CharField(verbose_name='地区名',help_text='地区名',max_length=20,null=True,blank=True)
    level = models.CharField(verbose_name='区域等级',help_text='区域等级',max_length=20,null=True,blank=True)

    class Meta:
        db_table = 'area'
        verbose_name = '地区表'

class VerifyCode(models.Model):
    """验证码模型"""
    mobile = models.CharField(verbose_name='手机号码',help_text='手机号码',max_length=11,null=True,blank=True)
    code = models.CharField(verbose_name='验证码',help_text='验证码',max_length=6,null=True,blank=True)
    create_time = models.DateTimeField(auto_now_add=True,verbose_name='生成时间',help_text='生成时间')

    class Meta:
        db_table = 'verifycode'
        verbose_name = '手机验证码表'

 执行迁移文件,生成表结构

E:\desktop\my_drf\MyShop>python manage.py makemigrations
Migrations for 'users':
  apps\users\migrations\0001_initial.py
    - Create model User
    - Create model Area
    - Create model VerifyCode
    - Create model Addr

E:\desktop\my_drf\MyShop>python manage.py migrate

 结果展示:

 用户鉴权:使用JWT认证

创建超级管理员用户

E:\desktop\my_drf\MyShop>python manage.py createsuperuser
用户名: pass
电子邮件地址: pass@qq.com
Password:
Password (again):

JWT权限认证配置

# 注册jwt
'rest_framework_simplejwt',

# 配置setting
REST_FRAMEWORK = {
    # DRF配置鉴权方式
    'DEFAULT_AUTHENTICATION_CLASSES': (
        'rest_framework_simplejwt.authentication.JWTAuthentication',
        'rest_framework.authentication.BasicAuthentication',  # Basic 认证
        'rest_framework.authentication.SessionAuthentication',  # Session 认证
    ),
}

# 配置总路由urls

path('api/users/',include('apps.users.urls'))

# user url 配置
from rest_framework_simplejwt.views import TokenVerifyView, TokenRefreshView, TokenObtainPairView

urlpatterns = [
    path('login/', TokenObtainPairView.as_view(), name='login'),  # 登录
    path('token/refresh/', TokenRefreshView.as_view(), name='token_refresh'),  # token 刷新
    path('token/verify/', TokenVerifyView.as_view(), name='token_verify'),  # token 效验
]

 配置Postman环境变量

Postman运行示图:

 自定义用户登录功能的实现

from rest_framework_simplejwt.views import TokenObtainPairView

# Create your views here.
class LoginView(TokenObtainPairView):
    def post(self, request, *args, **kwargs):
        serializer = self.get_serializer(data=request.data)

        try:
            serializer.is_valid(raise_exception=True)
        except TokenError as e:
            raise InvalidToken(e.args[0])
        # 自定义登录成功后返回的数据信息
        result = serializer.validated_data
        result['id'] = serializer.user.id
        result['email'] = serializer.user.email
        result['mobile'] = serializer.user.mobile
        result['username'] = serializer.user.username
        result['token'] = result.pop('access')

        return Response(serializer.validated_data, status=status.HTTP_200_OK)

运行结果:

用户注册功能的实现

import re
from rest_framework import status
from rest_framework.response import Response
from rest_framework_simplejwt.exceptions import TokenError, InvalidToken
from rest_framework_simplejwt.views import TokenObtainPairView
from rest_framework.views import APIView
from .models import User
# Create your views here.
class RegisterView(APIView):
    def post(self,request):
        """注册:接收参数并校验、创建用户 """
        username = request.data.get('username')
        password = request.data.get('password')
        email = request.data.get('email')
        password_confirmation = request.data.get('password_confirmation')
        # 检验
        print(all([username,password,email,password_confirmation]))
        print([username,password,email,password_confirmation])
        if not all([username,password,email,password_confirmation]):
            return Response({'error':'所有参数不能为空'},status=status.HTTP_422_UNPROCESSABLE_ENTITY)
        # 检验用户是否已存在
        if User.objects.filter(username=username).exists():
            return Response({'error':'用户名已存在'},status=status.HTTP_422_UNPROCESSABLE_ENTITY)
        # check password
        if password !=password_confirmation:
            return Response({'error':'两次输入的密码不一致'},status=status.HTTP_422_UNPROCESSABLE_ENTITY)
        if not (6<len(password)<18):
            return Response({'error':'密码长度需要在6-18位之间'},status=status.HTTP_422_UNPROCESSABLE_ENTITY)
        # check email
        if User.objects.filter(email=email).exists():
            return Response({'error':'该邮箱已被他人注册'},status=status.HTTP_422_UNPROCESSABLE_ENTITY)
        if not re.match(r'^[a-z0-9][\w.\-]*@[a-z0-9\-]+(\.[a-z]{2,5}){1,2}$',email):
            return Response({'error':'邮箱格式有误'},status=status.HTTP_422_UNPROCESSABLE_ENTITY)
        # 创建用户
        obj = User.objects.create_user(username=username,email=email,password=password)
        res = {
            'username':username,
            'id':obj.id,
            'email':obj.email
        }
        return Response(res,status=status.HTTP_201_CREATED)


# url 配置
path('register/', RegisterView.as_view(), name='register'),  # 注册

多字段用户登录功能支持

2024-02.22 更新中。。。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/398579.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

MongoDB 权限管理

文章目录 前言1. 权限控制1.1 MongoDB 默认角色1.1.1 读写角色1.1.2 管理角色1.1.3 其他角色1.1.4 超级用户角色 1.2 用户管理1.2.1 查看用户1.2.2 创建新用户1.2.3 调整角色1.2.4 删除用户1.2.4 修改密码 前言 上一篇 《MongoDB 单机安装部署》 文章中&#xff0c;为 MongoDB…

MySQL安装教程(详细版)

今天分享的是Win10系统下MySQL的安装教程&#xff0c;打开MySQL官网&#xff0c;按步骤走呀~ 宝们安装MySQL后&#xff0c;需要简单回顾一下关系型数据库的介绍与历史&#xff08;History of DataBase&#xff09; 和 常见关系型数据库产品介绍 呀&#xff0c;后面就会进入正式…

Pytorch学习05_常见的transforms01

案例解释 创建新的py文件 引入transforms模块 from torchvision import transforms 按住”Ctrl“&#xff0c;鼠标左键点击”transforms“&#xff0c;跳转到”__init__.py“ 再次按住”Ctrl“&#xff0c;鼠标点击”.transforms”&#xff0c;跳转到transforms.py中 __call_…

微服务—RabbitMQ高级(业务在各方面的可靠性)

本博客为个人学习笔记&#xff0c;学习网站&#xff1a;2023黑马程序员RabbitMQ入门到实战教程 高级篇章节 目录 生产者可靠性 生产者重连机制 生产者确认机制 介绍 实现 总结与建议 MQ可靠性 数据持久化 LazyQueue 消费者可靠性 消费者确认机制 失败重试机制 失…

Nginx 403 forbidden

1、没有权限问题 Linux系统中如果Nginx没有web目录的操作权限&#xff0c;也会出现403错误。解决办法&#xff1a;修改web目录的读写权限&#xff0c;或者是把Nginx的启动用户改成目录的所属用户&#xff0c;重启Nginx即可解决。(windows 下则用管理员启动nginx即可)。 chmod -…

uniapp上传文件到腾讯云

官方API地址 javaScript_SDK 下载cos npm i cos-js-sdk-v5 --save 生成签名 获取secretId和secretKey let cos new COS({SecretId: *******************************,SecretKey: ******************************,}) 参考文章&#xff1a;腾讯云如何获取secretId和secret…

力扣精选算法100道——提莫攻击(模拟专题)

目录 &#x1f6a9;题目解析 &#x1f6a9;算法原理 &#x1f6a9;实现代码 &#x1f6a9;题目解析 输入&#xff1a;timeSeries [1,4], duration 2 输出&#xff1a;4 解释&#xff1a;提莫攻击对艾希的影响如下&#xff1a; - 第 1 秒&#xff0c;提莫攻击艾希并使其立即…

【Git】:分支管理

分支管理 一.概念二.分支管理基本操作三.分支管理策略1.noff模式2.分支策略 一.概念 在版本回退⾥&#xff0c;你已经知道&#xff0c;每次提交&#xff0c;Git都把它们串成⼀条时间线&#xff0c;这条时间线就可以理解为是⼀个分⽀。截⽌到⽬前&#xff0c;只有⼀条时间线&…

搜索中关于稀疏检索和稠密向量检索的召回效果比较

不同检索方式说明 最近在做搜索召回提升相关的研究工作。对比了稀疏检索和稠密向量检索的效果。其中使用的搜索引擎为elasticsearch8.x版本。稀疏检索包括BM25的检索方式&#xff0c;以及es官方在8.8之后版本提供的稀疏向量模型的方式。稠密向量检索&#xff0c;是指借助机器学…

tqdm,Python进度条库快速上手

前言 在编程中&#xff0c;尤其是处理长时间运行的任务时&#xff0c;了解程序的进度是非常重要的。Python中有一个非常实用的库&#xff0c;名为 tqdm &#xff0c;它能够以极简的方式帮助我们快速创建进度条。本文将向初学者介绍如何在Python中使用 tqdm 库来制作进度条。 …

2、电源管理入门之开机详解

目录 1. 硬件上电 2. ATF运行 3. Linux启动 3.1 内核启动start_kernel 3.2 平台启动setup_arch 3.4 DTS初始化psci_dt_init 3.5 系统rest创建kernel_init线程 3.6 SMP初始化smp_init 3.7 PSCI接口psci_cpu_on 3.8 SMC返回secondary_entry 系统开机牵扯到:“我是…

Springboot 中使用 Redisson+AOP+自定义注解 实现访问限流与黑名单拦截

&#x1f3f7;️个人主页&#xff1a;牵着猫散步的鼠鼠 &#x1f3f7;️系列专栏&#xff1a;Java全栈-专栏 &#x1f3f7;️个人学习笔记&#xff0c;若有缺误&#xff0c;欢迎评论区指正 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&…

python3 flask 实现对config.yaml文件的内容的增删改查,并重启服务

config.yaml配置文件内容 功能就是userpass下的用户名和密码做增删改查&#xff0c;并重启hy2服务 auth:type: userpassuserpass:csdn: csdnlisten: :443 masquerade:proxy:rewriteHost: trueurl: https://www.bing.com/type: proxy tls:cert: /root/hyst*****马赛克******er…

JS文本加密方法探究

在前端开发中&#xff0c;有时候我们需要对敏感文本进行简单的加密&#xff0c;以提高安全性。本文将介绍一种基于 JavaScript 实现的文本加密方法&#xff0c;使用了 Base64、Unicode 和 ROT13 编码。 示例代码 function encodeText(text) {// Base64编码var base64Encoded …

苍穹外卖——第一天nginx

放到全是英文路径的打不开 到安装路径进入cmd&#xff0c;输入nginx -t nginx: the configuration file E:\Astudy\nginx-1.20.2/conf/nginx.conf syntax is ok nginx: [emerg] bind() to 0.0.0.0:80 failed (10013: An attempt was made to access a socket in a way forbid…

linux部署jenkins,支持jdk1.8

无废话&#xff0c;纯干活安装指令 本文前提条件需安装jdk8&#xff0c;安装参考&#xff1a;Linux配置jdk环境 下载资源 # 创建安装目录 mkdir -p /data/jenkins && cd /data/jenkins# 下载jenkins的war包&#xff0c;v2.346.x支持jdk1.8&#xff0c;高于这个版本的…

板块一 Servlet编程:第六节 HttpSession对象全解 来自【汤米尼克的JAVAEE全套教程专栏】

板块一 Servlet编程&#xff1a;第六节 HttpSession对象全解 一、什么是HttpSessionSession的本质 二、创建Seesion及常用方法三、Session域对象四、Session对象的销毁 在上一节中&#xff0c;我们学习了Servlet五大对象里的第三个Cookie对象&#xff0c;但Cookie是有大小限制和…

ajax 如何从服务器上获取数据?

在Web开发中&#xff0c;AJAX&#xff08;Asynchronous JavaScript and XML&#xff09;是一种常用的技术&#xff0c;用于在不重新加载整个页面的情况下&#xff0c;从服务器获取数据并更新网页的某一部分。使用AJAX&#xff0c;你可以创建异步请求&#xff0c;从而提供更快的…

AI:133-基于深度学习的工业质检自动化

🚀点击这里跳转到本专栏,可查阅专栏顶置最新的指南宝典~ 🎉🎊🎉 你的技术旅程将在这里启航! 从基础到实践,深入学习。无论你是初学者还是经验丰富的老手,对于本专栏案例和项目实践都有参考学习意义。 ✨✨✨ 每一个案例都附带有在本地跑过的关键代码,详细讲解供…

Git 关于SSH密钥的生成

一&#xff1a;配置ssh 桌面右键鼠标打开 “Git Bash Here” 键入命令&#xff1a;ssh-keygen -t ed25519 -C "自己邮箱 " 接着就一路回车 打开 C:\Users\Administrator.ssh 目录&#xff0c; 复制 id_xxxxx.pub 内容 文件里面则是一些信息&#xff0c;如下 …