drf_simple_pro
django+默认认证系统+扩展User模型类+jwt
准备
1.创建虚拟环境
mkvirtualenv drf_simple_pro
扩展
创建虚拟环境: mkvirtualenv 虚拟环境名称 创建虚拟环境(指定python版本): mkvirtualenv -p python3 虚拟环境名称 查看所有虚拟环境: workon+2次tab键 使用虚拟环境: workon 虚拟环境名称 退出虚拟环境: deactivate 删除虚拟环境(必须先退出虚拟环境内部才能删除当前虚拟环境): rmvirtualenv 虚拟环境名称 其他相关命令: 查看虚拟环境中安装的包: pip freeze 或者 pip list 收集当前环境中安装的包及其版本: pip freeze > requirements.txt 在部署项目的服务器中安装项目使用的模块: pip install -r requirements.txt
2.pip安装部件
以下安装如果发现速度过慢,可以在后面加上-i https://mirrors.aliyun.com/pypi/simple/
pip install django
pip install djangorestframework
3.创建项目
先进入存放项目的文件夹
django-admin startproject drf_simple_pro
使用 tree drf_simple_pro/ 查看项目目录
drf_simple_pro/
├── drf_simple_pro
│ ├── __init__.py
│ ├── settings.py
│ ├── urls.py
│ └── wsgi.py
└── manage.py
4.使用pycharm
1.打开
2.选择之前创建的虚拟环境
3.启动
成功效果:
5.调整目录
复制settings.py里的内容,删除此文件并创建settings文件夹,在里面建立dev.py和prop.py文件,将复制的内容粘贴到dev.py文件里,用作开发使用,上线时再配置使用prop.py
drf_simple_pro/ ├── docs/ # 项目相关资料保存目录 ├── logs/ # 项目运行时/开发时日志目录 ├── manage.py ├── luffy/ # 项目主应用,开发时的代码保存 │ ├── apps/ # 开发者的代码保存目录,以模块[子应用]为目录保存 │ ├── libs/ # 第三方类库的保存目录[第三方组件、模块] │ ├── settings/ │ ├── dev.py # 项目开发时的本地配置 │ ├── prop.py # 项目上线时的运行配置 │ ├── urls.py # 总路由 │ ├── utils/ # 多个模块[子应用]的公共函数类库[自己开发的组件] └── scripts/ # 保存项目运营时的脚本文件
由于更改了配置文件的位置及名称,所以要更改启动文件manage.py
由于更改了应用的存放地点,所以在dev.py里面增加一个系统导包路径,否则注册app及其他使用时会报错
# 新增一个系统导包路径 import sys sys.path.insert(0,os.path.join(BASE_DIR,"apps"))
6.数据库相关
1.创建数据库
create database drf_simple_pro default charset=utf8mb4;
2.为当前项目创建数据库用户[这个用户只能看到这个数据库]
create user drf_simple_pro identified by '123'; #创建用户 grant all privileges on drf_simple_pro.* to 'drf_simple_pro'@'%'; # 为用户分配权限 flush privileges; #
3.配置数据库连接,修改settings/dev.py
4.安装
pip install PymySQL
5.
6.启动项目,解决两个问题
第一个,数据库版本检测导致的错误
解决方案:注释掉数据库的版本检测代码
第二个,数据库版本的默认编码导致,query返回的内容格式使用有误
解决方案:新增一行代码,把query查询结果转换格式为 bytes类型
登录功能
1.创建用户模块的子应用
先进入apps文件夹
python ../../manage.py startapp users
在settings.py文件中注册子应用
INSTALLED_APPS = [ ... 'users', ]
2.创建自定义的用户模型类
在创建好的应用models.py中定义用户的用户模型类
from django.contrib.auth.models import AbstractUser from django.db import models # Create your models here. class User(AbstractUser): """自定义用户模型类""" mobile = models.CharField(max_length=11, unique=True, verbose_name="手机号") class Meta: db_table = "cus_users" verbose_name = "用户" verbose_name_plural = verbose_name
在配置文件dev.py中进行设置
# 告知django认证系统使用自定义模型类 AUTH_USER_MODEL = 'users.User'
执行数据库迁移
python manage.py makemigrations
python manage.py migrate
3.认证机制使用jwt
安装
pip install djangorestframework-jwt
settings/dev.py配置文件
REST_FRAMEWORK = { # 异常处理 'EXCEPTION_HANDLER': 'luffy.utils.exceptions.custom_exception_handler', # 配置用户认证方式 'DEFAULT_AUTHENTICATION_CLASSES': ( 'rest_framework_jwt.authentication.JSONWebTokenAuthentication', 'rest_framework.authentication.SessionAuthentication', 'rest_framework.authentication.BasicAuthentication', ), } import datetime JWT_AUTH = { # 配置jwt的有效期 'JWT_EXPIRATION_DELTA': datetime.timedelta(days=1), }
4.设置路由
总路由
from django.contrib import admin from django.urls import path, include urlpatterns = [ ... path('users/', include("users.urls")), # include 的值必须是 模块名.urls 格式,字符串中间只能出现一个圆点 ]
apps/users创建urls.py
from django.urls import path from rest_framework_jwt.views import obtain_jwt_token urlpatterns = [ path(r'authorizations/', obtain_jwt_token), ]
5.测试
创建创建用户
python manage.py createsuperuser
使用postman测试,输入正确的用户名密码会返回一个token
6.自定义jwt认证成功返回数据
默认的返回值仅有token,我们还需在返回值中增加username和id,方便在客户端页面中显示当前登陆用户
在users/下新建utils.py,写入
def jwt_response_payload_handler(token, user=None, request=None): """ 自定义jwt认证成功返回数据 """ return { 'token': token, 'id': user.id, 'username': user.username, 'password': user.password }
settings/dev.py配置文件添加内容
... ... import datetime JWT_AUTH = { ... # 设置jwt登录视图的返回值 'JWT_RESPONSE_PAYLOAD_HANDLER': 'users.utils.jwt_response_payload_handler', }
如下
效果
此时已完成用户登录,成功会返回以上自定义的返回信息
用户名或密码错误,返回以下信息