# cassoapi **Repository Path**: casso123456/cassoapi ## Basic Information - **Project Name**: cassoapi - **Description**: DRF - **Primary Language**: Python - **License**: MulanPSL-2.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2019-11-24 - **Last Updated**: 2021-01-08 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README ``` CREATE DATABASE `cassoapi` DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci; pip install django-cors-headers pip install djangorestframework pip install djangorestframework-jwt pip install mysqlclient ``` * TIPS: 如果将应用集中放在apps中则需要: `settings.py`: `sys.path.insert(0, os.path.join(BASE_DIR, "apps"))` 1. 注册应用的时候只写应用名就行 2. 引用应用内的模块时如 : `from users.models import User` ###### 用 户模块基本流程 * 用户认证与权限限制: 1. 在每次请求到达视图之前就会先执行认证部分的代码 * 认证流程: 1. 使用第三方认证模块:`pip install restframework-jwt` 2. 在`settings`里全局配置: * 配置jwt ``` "DEFAULT_AUTHENTICATION_CLASSES": ( #"rest_framework.authentication.BasicAuthentication", #框架自带验证模式:验证用户名密码 #"rest_framework.authentication.SessionAuthentication", # 框架自带验证模式:验证用户名密码 生成session保存到数据 "rest_framework_jwt.authentication.JSONWebTokenAuthentication", # 第三方包验证模式:验证用户名密码生成token返回给客户端,之后客户端每次请求头都需要携带这个token ), ``` 3. 在局部视图集配置用户认证: * `authentication_classes = [JSONWebTokenAuthentication]` # 认证用户信息--最先执行且覆盖掉settings全局认证 4. 也可以自定义认证逻辑(默认是提供用户名跟密码但是实际需求可能用电话号码代替用户也可以登录成功): * settings.py: ``` # 修改用户auth 自定义认证 AUTHENTICATION_BACKENDS = ( 'app01.views.CustomBackend', # 指向我们自定义的验证类--我是在app01里面定义的类 ) REST_FRAMEWORK = { # 分页---只需两行代码 1.指定分页器类 2.指定每页数量 "DEFAULT_PAGINATION_CLASS": "rest_framework.pagination.PageNumberPagination", # 每页显示的个数 "PAGE_SIZE": 2, # 配置jwt "DEFAULT_AUTHENTICATION_CLASSES": ( "rest_framework.authentication.BasicAuthentication", "rest_framework.authentication.SessionAuthentication", "rest_framework_jwt.authentication.JSONWebTokenAuthentication", ), # 限速设置 "DEFAULT_THROTTLE_CLASSES": ( "rest_framework.throttling.AnonRateThrottle", # 未登陆用户 "rest_framework.throttling.UserRateThrottle", # 登陆用户 ), "DEFAULT_THROTTLE_RATES": { "anon": "2/minute", # 每分钟可以请求两次 "user": "5/minute", # 每分钟可以请求五次 }, } # JWT有效时间限制 JWT_AUTH = { "JWT_EXPIRATION_DELTA": timedelta(days=7), "JWT_AUTH_HEADER_PREFIX": "JWT", # JWT跟前端保持一致,比如“token”这里设置成JWT } ``` * views.py: ``` from django.contrib.auth.backends import ModelBackend class CustomBackend(ModelBackend): # 继承ModelBackend类,并实现authenticate方法(重写覆盖) def authenticate(self, request, username=None, password=None, **kwargs): try: # 用户名和手机都能登录 user = User.objects.get(Q(username=username) | Q(mobile=username)) if user.check_password(password): return user except Exception as e: return None ``` * urls.py: ``` from rest_framework_jwt.views import obtain_jwt_token path("login/", obtain_jwt_token), # 这个地址就是用户提交用户名跟密码到地址,返回token字符串 ``` * 前端请求方法:我使用axios 1. 在每次请求头里面必须添加: Authorization,值为jwt空格+token字符串 ``` axios.get("http://172.16.1.97:8000/goods", { headers: { "Authorization": `JWT ${this.mytoken}` } }) ``` 2. 可以为axios统一添加请求头: `axios.defaults.headers.common['Authorization'] = token_value;` 5. 权限认证: * `views.py`: `from rest_framework import permissions` 1. 在视图类中添加: `permission_classes = [permissions.IsAdminUser]` # 权限限制--必须是后台管理员员才可以访问这个api ###### api接口详述: 1. 用户视图集 UserViewset 实现功能: 获取当前用户详细信息 get 新增注册单条用户信息 post 修改用户基本信息 put 修改用户密码--待定 put 2. 用户收货地址信息视图集 实现功能: 获取当前用户所有收货地址 get 修改其中一条地址信息 put 删除地址一条地址信息 delete 新增一条地址信息 post 3. 产品总目录视图集 实现功能: 获取列表及详情 get 4. 产品二级目录视图集 实现功能: 获取列表及详情 get 显示父目录名称 get 根据父目录获取所有直属二级目录 get /subcategory/?parentcategory=4 5. 产品视图集 实现功能: 获取列表及详情 get 显示二级目录名称 get 根据二级目录返回对应产品列表 get 根据产品名称里面到字符以及产品描述里面的字符进行产品搜索 get 根据价格、销量、库存、点击量、收藏量进行排序 get (比较排序的字段的值应该为纯数值。。。坑了。价格有¥符号) 前段自定义分页 6. 产品详情图片视图集 实现功能: 根据产品返回对应数据列表 get 前段自定义分页 7. 产品详情内容图片视图集 实现功能: 根据产品返回对应数据列表 get 前段自定义分页 8. 产品参数视图集 实现功能: 根据产品返回对应数据列表 get 前段自定义分页 9. 订单视图集 实现功能: 用户订单CRUD get post put delete 显示外键信息详情 10. 用户收藏视图集 实现功能: 用户收藏列表CRUD get post put delete 显示外键信息详情 11. 用户购物车视图集 实现功能: 用户购物车列表CRUD get post put delete 显示外键信息详情 * next.... * 中途发现问题: 1. 需要根据父目录直接获取改目录下所有数据,所以需要给每个goods添加一个mainCategory,只能价格单位符号也需要修改,就直接调整了数据库的数据.. 2. 想实现扫码登录必须先有一个通过审核的小程序,利用里面的appid和screct等信息才能实现扫码登录 * Swagger--API文档 1. pip install django-rest-swagger # 2.2.0 2. 注册app 3. 配置urls.py 4. 别忘记在settings.py 中drf的配置中添加:'DEFAULT_SCHEMA_CLASS': 'rest_framework.schemas.AutoSchema' 5. 访问api/docs/ 接口即可 #### Commit 规范 ###### 格式如下 * 例:`fead(type)`:本次提交概述 * `type`: 本次 commit 的类型,诸如 bugfix docs style 等,参考如下: * `fead`:添加新功能 * `fix`:修补缺陷 * `docs`:修改文档 * `style`:修改格式 * `refactor`:重构 * `perf`:优化 * `test`:增加测试 * `chore`:构建过程或辅助工具的变动 * `revert`:回滚到上一个版本 * `scope`: 本次 `commit` 波及的范围 * `subject`: 简明扼要的阐述下本次 `commit` 的主旨,在原文中特意强调了几点: 1. 使用祈使句,是不是很熟悉又陌生的一个词 2. 首字母不要大写 3. 结尾无需添加标点