zoukankan      html  css  js  c++  java
  • 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',
    }

     如下

    效果

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

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

  • 相关阅读:
    10年后编程还有意义吗?
    专访Jeffrey Richter:Windows 8是微软的重中之重
    x86汇编指令脚本虚拟机
    基于容器的持续交付管道
    NET Core 整合Autofac和Castle
    数据结构与算法1
    Redis集群
    react + iscroll5
    MongoDB
    WebComponent
  • 原文地址:https://www.cnblogs.com/yijue-lu/p/11006964.html
Copyright © 2011-2022 走看看