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 Web服务器Tornado使用小结
May 06 Python
Python实现Linux的find命令实例分享
Jun 04 Python
Python环境搭建之OpenCV的步骤方法
Oct 20 Python
python好玩的项目—色情图片识别代码分享
Nov 07 Python
python中使用PIL制作并验证图片验证码
Mar 15 Python
pyhton列表转换为数组的实例
Apr 04 Python
python字典一键多值实例代码分享
Jun 14 Python
python求绝对值的三种方法小结
Dec 04 Python
Python 日期的转换及计算的具体使用详解
Jan 16 Python
使用Python来做一个屏幕录制工具的操作代码
Jan 18 Python
对tensorflow中cifar-10文档的Read操作详解
Feb 10 Python
Anaconda+vscode+pytorch环境搭建过程详解
May 25 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和ACCESS写聊天室(三)
2006/10/09 PHP
PHP 检查扩展库或函数是否可用的代码
2010/04/06 PHP
setcookie中Cannot modify header information-headers already sent by错误的解决方法详解
2013/05/08 PHP
php二维数组排序方法(array_multisort usort)
2013/12/25 PHP
完美解决thinkphp唯一索引重复时出错的问题
2017/03/31 PHP
Yii框架参数配置文件params用法实例分析
2019/09/11 PHP
Thinkphp框架使用list_to_tree 实现无限级分类列出所有节点示例
2020/04/04 PHP
一个JavaScript继承的实现
2006/10/24 Javascript
javascript 操作Word和Excel的实现代码
2009/10/26 Javascript
jQuery照片伸缩效果不影响其他元素的布局
2014/05/09 Javascript
javascript正则表达式使用replace()替换手机号的方法
2015/01/19 Javascript
js实现跨域的4种实用方法原理分析
2015/10/29 Javascript
微信小程序 网络API Websocket详解
2016/11/09 Javascript
EasyUI创建人员树的实例代码
2017/09/15 Javascript
关于Google发布的JavaScript代码规范你要知道哪些
2018/04/04 Javascript
解决vue的 v-for 循环中图片加载路径问题
2018/09/03 Javascript
Vue CLI 3搭建vue+vuex最全分析(推荐)
2018/09/27 Javascript
React 源码中的依赖注入方法
2018/11/07 Javascript
详解mpvue实现对苹果X安全区域的适配
2019/07/31 Javascript
json_decode 索引为数字时自动排序问题解决方法
2020/03/28 Javascript
[40:17]2018DOTA2亚洲邀请赛 4.5 淘汰赛 LGD vs Liquid 第一场
2018/04/06 DOTA
利用Python绘制数据的瀑布图的教程
2015/04/07 Python
Python实现抢购IPhone手机
2018/02/07 Python
Python图像处理PIL各模块详细介绍(推荐)
2019/07/17 Python
python3反转字符串的3种方法(小结)
2019/11/07 Python
Keras构建神经网络踩坑(解决model.predict预测值全为0.0的问题)
2020/07/07 Python
css3实现画半圆弧线的示例代码
2017/11/06 HTML / CSS
CSS3实现文字描边的2种方法(小结)
2020/02/14 HTML / CSS
Html5之自定义属性(data-,dataset)
2019/11/19 HTML / CSS
下面关于"联合"的题目的输出是什么
2013/08/06 面试题
工地安全检查制度
2014/02/04 职场文书
会计专业应届生自荐信
2014/06/28 职场文书
2014年小学教师工作自我评价
2014/09/22 职场文书
民主生活会批评与自我批评总结
2014/10/17 职场文书
查摆问题整改措施
2014/10/24 职场文书
2014年班主任工作总结
2014/11/08 职场文书