Django rest framework如何自定义用户表


Posted in Python onJune 09, 2021

说明

Django 默认的用户表 auth_user 包含 id, password, last_login, is_superuser, username, last_name, email, is_staff, is_active, date_joined, first_name 字段。这些基本字段不够用时,在此基本表上拓展字段是很好选择。本文介绍在 DRF(Django Rest Framework) 上使用自定义用户表进行接口访问控制的功能设计。

1. Django项目和应用创建

先装必要的模块

pip install django
pip install djangorestframework

创建项目文件夹、项目和应用

E:\SweetYaya> mkdir MyProj01
E:\SweetYaya> cd MyProj01
E:\SweetYaya\MyProj01> django-admin startproject MyProj01 .
E:\SweetYaya\MyProj01> django-admin startapp MyApp

同步数据库

E:\SweetYaya\MyProj01> python manage.py migrate
Operations to perform:
  Apply all migrations: admin, auth, contenttypes, sessions
Running migrations:
  Applying contenttypes.0001_initial... OK
  Applying auth.0001_initial... OK
  Applying admin.0001_initial... OK
  Applying admin.0002_logentry_remove_auto_add... OK
  ...
  Applying sessions.0001_initial... OK

执行如下命令后测试访问 http://127.0.0.1:8000/

E:\SweetYaya\MyProj01>python manage.py runserver
Watching for file changes with StatReloader
Performing system checks...

System check identified no issues (0 silenced).
June 07, 2021 - 21:16:57
Django version 3.2.4, using settings 'MyProj01.settings'
Starting development server at http://127.0.0.1:8000/
Quit the server with CTRL-BREAK.

2. 自定义User表

打开 MyApp/models.py 文件,创建继承自 AbstractUserUserProfile 类,给它添加 namemobile 字段,它就是我们自定义的用户表。

from django.db import models
from django.contrib.auth.models import AbstractUser


class UserProfile(AbstractUser):
    name = models.CharField(max_length=30, null=True, blank=True, verbose_name="姓名")
    mobile = models.CharField(max_length=11, verbose_name="电话")

    class Meta:
        verbose_name = "用户"
        verbose_name_plural = "用户"

        def __str__(self):
            return self.name

3. 序列化和路由

我们直接在 MyProj01/url.py 中进行定义序列化方法和路由配置

from django.urls import path, include
from MyApp.models import UserProfile
from rest_framework import routers, serializers, viewsets


# Serializers define the API representation.
class UserSerializer(serializers.HyperlinkedModelSerializer):
    class Meta:
        model = UserProfile
        fields = ['url', 'username', 'name', 'mobile', 'email', 'is_staff']


# ViewSets define the view behavior.
class UserViewSet(viewsets.ModelViewSet):
    queryset = UserProfile.objects.all()
    serializer_class = UserSerializer


# Routers provide an easy way of automatically determining the URL conf.
router = routers.DefaultRouter()
router.register('users', UserViewSet)

# Wire up our API using automatic URL routing.
# Additionally, we include login URLs for the browsable API.
urlpatterns = [
    path('', include(router.urls)),
    path('api-auth/', include('rest_framework.urls', namespace='rest_framework'))
]

3. DRF配置

找到 MyProj01/settings.py ,做如下配置

加入上面创建的应用和 rest_framework

INSTALLED_APPS = [
    'django.contrib.admin',
	...
    'rest_framework',
    'MyApp',
]

添加全局认证设置

REST_FRAMEWORK = {
    'DEFAULT_PERMISSION_CLASSES': [
        'rest_framework.permissions.IsAuthenticated'
    ]
}

修改默认用户表,至此 settings.py 全部配置完成了。

AUTH_USER_MODEL = 'MyApp.UserProfile'

4. 同步数据库

执行 makemigrations 命令

E:\SweetYaya\MyProj01> python manage.py makemigrations
Migrations for 'MyApp':
  MyApp\migrations\0001_initial.py
    - Create model UserProfile

执行 migrate 命令出现如下错误

 

E:\SweetYaya\MyProj01> python manage.py migrate
Traceback (most recent call last):
  File "manage.py", line 22, in <module>
    main()
  File "manage.py", line 18, in main
    execute_from_command_line(sys.argv)
  File "D:\Program Files\Python36\lib\site-packages\django\core\management\__init__.py", line 419, in execute_from_command_line
    utility.execute()
  File "D:\Program Files\Python36\lib\site-packages\django\core\management\__init__.py", line 413, in execute
    self.fetch_command(subcommand).run_from_argv(self.argv)
  File "D:\Program Files\Python36\lib\site-packages\django\core\management\base.py", line 354, in run_from_argv
    self.execute(*args, **cmd_options)
  File "D:\Program Files\Python36\lib\site-packages\django\core\management\base.py", line 398, in execute
    output = self.handle(*args, **options)
  File "D:\Program Files\Python36\lib\site-packages\django\core\management\base.py", line 89, in wrapped
    res = handle_func(*args, **kwargs)
  File "D:\Program Files\Python36\lib\site-packages\django\core\management\commands\migrate.py", line 95, in handle
    executor.loader.check_consistent_history(connection)
  File "D:\Program Files\Python36\lib\site-packages\django\db\migrations\loader.py", line 310, in check_consistent_history
    connection.alias,
django.db.migrations.exceptions.InconsistentMigrationHistory: Migration admin.0001_initial is applied before its dependency MyApp.0001_initial on database 'default'.

解决办法

makemigrations打开 settings.py ,注释掉 INSTALL_APPS 中的
'django.contrib.admin',打开 urls.py ,注释掉 urlpatterns 中的 admin,再 migrate 就不报错了。最后注意把注释内容恢复回来就好了。

E:\SweetYaya\MyProj01> python manage.py migrate
Operations to perform:
  Apply all migrations: MyApp, admin, auth, contenttypes, sessions
Running migrations:
  Applying contenttypes.0001_initial... OK
  Applying contenttypes.0002_remove_content_type_name... OK
  ...
  Applying admin.0003_logentry_add_action_flag_choices... OK
  Applying sessions.0001_initial... OK

5. 测试

执行命令

E:\SweetYaya\MyProj01>python manage.py runserver

访问 http://127.0.0.1:8000/users/ 出现结果如下,此时表明配置成功,但是尚未进行用户登录无权访问。

Django rest framework如何自定义用户表

6. 命令行注册用户

进入 Python Shell

E:\SweetYaya\MyProj01> python manage.py shell
Python 3.6.6 (v3.6.6:4cf1f54eb7, Jun 27 2018, 03:37:03) [MSC v.1900 64 bit (AMD64)]
Type 'copyright', 'credits' or 'license' for more information
IPython 6.5.0 -- An enhanced Interactive Python. Type '?' for help.

键入如下代码

In [1]: from MyApp.models import UserProfile

In [2]: from django.contrib.auth.hashers import make_password

In [3]: ist = UserProfile(username='guest01',password=make_password('123456'))

In [4]: ist.save()

In [5]: ist = UserProfile(username='guest02',password=make_password('123456'))

In [6]: ist.save()

然后在数据库中查看 MyApp_userprofile 表发现多了两条记录,添加成功,继续访问 http://127.0.0.1:8000/users/ 地址,使用用户密码登录可见如下。测试完成。

Django rest framework如何自定义用户表

到此这篇关于Django rest framework如何自定义用户表的文章就介绍到这了,更多相关Django rest framework自定义用户表内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
python通过exifread模块获得图片exif信息的方法
Mar 16 Python
利用python爬取软考试题之ip自动代理
Mar 28 Python
浅谈Python批处理文件夹中的txt文件
Mar 11 Python
Python IDE Pycharm中的快捷键列表用法
Aug 08 Python
Python 私有化操作实例分析
Nov 21 Python
使用PyWeChatSpy自动回复微信拍一拍功能的实现代码
Jul 02 Python
python开发一个解析protobuf文件的简单编译器
Nov 17 Python
python通过cython加密代码
Dec 11 Python
python实现文件+参数发送request的实例代码
Jan 05 Python
pytorch 实现L2和L1正则化regularization的操作
Mar 03 Python
python 实现两个变量值进行交换的n种操作
Jun 02 Python
Pytest中conftest.py的用法
Jun 27 Python
如何使用Python提取Chrome浏览器保存的密码
Jun 09 #Python
python缺失值的解决方法总结
Jun 09 #Python
Python提取PDF指定内容并生成新文件
Python激活Anaconda环境变量的详细步骤
Jun 08 #Python
Python序列化与反序列化相关知识总结
Jun 08 #Python
浅谈怎么给Python添加类型标注
Python如何导出导入所有依赖包详解
Jun 08 #Python
You might like
php实现微信模板消息推送
2018/03/30 PHP
PHP unset函数原理及使用方法解析
2020/08/14 PHP
几个javascript操作word的参考代码
2009/10/26 Javascript
Extjs学习笔记之二 初识Extjs之Form
2010/01/07 Javascript
js用闭包遍历树状数组的方法
2014/03/19 Javascript
自己封装的javascript事件队列函数版
2014/06/12 Javascript
JavaScript简介
2015/02/15 Javascript
JavaScript中使用Object.prototype.toString判断是否为数组
2015/04/01 Javascript
javascript制作幻灯片(360度全景图片)
2015/07/28 Javascript
jQuery基于ajax()使用serialize()提交form数据的方法
2015/12/08 Javascript
浅析JavaScript中的变量复制、参数传递和作用域链
2016/01/13 Javascript
详解jQuery UI库中文本输入自动补全功能的用法
2016/04/23 Javascript
完美实现js焦点轮播效果(二)(图片可滚动)
2017/03/07 Javascript
Angular.JS内置服务$http对数据库的增删改使用教程
2017/05/07 Javascript
安装vue-cli的简易过程
2018/05/22 Javascript
vue中使用axios post上传头像/图片并实时显示到页面的方法
2018/09/27 Javascript
微信小程序出现wx.getLocation再次授权问题的解决方法分析
2019/01/16 Javascript
vue模仿网易云音乐的单页面应用
2019/04/24 Javascript
[00:29]2019完美世界全国高校联赛(秋季赛)总决赛海口落幕
2019/12/10 DOTA
python机器学习之神经网络(二)
2017/12/20 Python
对python中for、if、while的区别与比较方法
2018/06/25 Python
Python异常处理操作实例详解
2018/08/28 Python
Python嵌套式数据结构实例浅析
2019/03/05 Python
flask 使用 flask_apscheduler 做定时循环任务的实现
2019/12/10 Python
numpy实现神经网络反向传播算法的步骤
2019/12/24 Python
python操作gitlab API过程解析
2019/12/27 Python
python中with用法讲解
2020/02/07 Python
24个canvas基础知识小结
2014/12/17 HTML / CSS
Farfetch巴西官网:奢侈品牌时尚购物平台
2020/10/19 全球购物
如何查找网页漏洞
2016/06/22 面试题
车队司机个人自我鉴定
2014/04/17 职场文书
纪律教育月活动总结
2014/08/26 职场文书
争先创优心得体会
2014/09/12 职场文书
解除劳动合同证明书模板
2014/11/20 职场文书
2015年团委副书记工作总结
2015/07/23 职场文书
Python中文纠错的简单实现
2021/07/07 Python