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正则表达式匹配HTML页面编码
Apr 08 Python
编写Python爬虫抓取暴走漫画上gif图片的实例分享
Apr 20 Python
python命令行解析之parse_known_args()函数和parse_args()使用区别介绍
Jan 24 Python
tensorflow实现softma识别MNIST
Mar 12 Python
Python爬虫文件下载图文教程
Dec 23 Python
python实现转盘效果 python实现轮盘抽奖游戏
Jan 22 Python
python爬虫租房信息在地图上显示的方法
May 13 Python
python 缺失值处理的方法(Imputation)
Jul 02 Python
pycharm配置当鼠标悬停时快速提示方法参数
Jul 31 Python
用python3读取python2的pickle数据方式
Dec 25 Python
如何使用python传入不确定个数参数
Feb 18 Python
如何在Python项目中引入日志
May 31 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者的疑难问答(2)
2006/10/09 PHP
php 面试碰到过的问题 在此做下记录
2011/06/09 PHP
php正则表达式(regar expression)
2011/09/10 PHP
PHP生成随机密码类分享
2014/06/25 PHP
smarty内置函数config_load用法实例
2015/01/22 PHP
PHP获取photoshop写入图片文字信息的方法
2015/03/31 PHP
javascript中对Attr(dom中属性)的操作示例讲解
2013/12/02 Javascript
收集json解析的四种方法分享
2014/01/17 Javascript
jQuery源码解读之addClass()方法分析
2015/02/20 Javascript
js如何实现淡入淡出效果
2020/11/18 Javascript
JavaScript SweetAlert插件实现超酷消息警告框
2016/01/28 Javascript
早该知道的7个JavaScript技巧
2016/06/21 Javascript
js插件实现图片滑动验证码
2020/09/29 Javascript
vue 设置proxyTable参数进行代理跨域
2018/04/09 Javascript
vue2.0项目集成Cesium的实现方法
2019/07/30 Javascript
微信小程序如何实现五星评价功能
2019/10/15 Javascript
Openlayers+EasyUI Tree动态实现图层控制
2020/09/28 Javascript
vue 获取url参数、get参数返回数组的操作
2020/11/12 Javascript
[02:11]完美世界DOTA2联赛10月28日赛事精彩集锦:来吧展示实力强劲
2020/10/29 DOTA
Python多线程编程(一):threading模块综述
2015/04/05 Python
Windows上使用virtualenv搭建Python+Flask开发环境
2016/06/07 Python
Python入门_浅谈数据结构的4种基本类型
2017/05/16 Python
浅谈python中的正则表达式(re模块)
2017/10/17 Python
python实现根据文件关键字进行切分为多个文件的示例
2018/12/10 Python
Python定时从Mysql提取数据存入Redis的实现
2020/05/03 Python
Python 通过正则表达式快速获取电影的下载地址
2020/08/17 Python
美体小铺波兰官方网站:The Body Shop波兰
2019/09/03 全球购物
马来西亚在线购物:POPLOOK.com
2019/12/09 全球购物
Java Servlet的主要功能和作用是什么
2014/02/14 面试题
大学生四年生活自我鉴定
2013/11/21 职场文书
中学生自我评价范文
2014/02/08 职场文书
股权转让意向书
2014/04/01 职场文书
租房协议书范例
2014/10/14 职场文书
2014年宣传部工作总结
2014/11/12 职场文书
销售内勤岗位职责
2015/02/10 职场文书
2016年小学“公民道德宣传日”活动总结
2016/04/01 职场文书