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
View Code

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.在项目主模块的__init__.py中导入pymysql

 

 

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',
}

 如下

效果

 

此时已完成用户登录,成功会返回以上自定义的返回信息

 用户名或密码错误,返回以下信息

 

posted @ 2019-06-11 23:30  yijue_lu  阅读(200)  评论(0编辑  收藏  举报