Django rest framework如何自定义用户表

作者:小龙狗 时间:2022-03-12 01:15:02 

说明

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如何自定义用户表

来源:https://blog.csdn.net/ShyLoneGirl/article/details/117674422

标签:Django,rest,framework,用户表
0
投稿

猜你喜欢

  • Python实战之手写一个搜索引擎

    2023-07-11 21:16:49
  • MySQL query_cache_type 参数与使用详解

    2024-01-29 08:02:58
  • PyQt5 关于Qt Designer的初步应用和打包过程详解

    2023-07-31 20:26:32
  • 详解Python如何巧妙实现数学阶乘n!

    2023-07-06 10:22:56
  • MySQL中表锁和行锁机制浅析(源码篇)

    2024-01-27 22:12:55
  • python编写简易聊天室实现局域网内聊天功能

    2023-08-30 07:45:52
  • 讲解数据库管理系统必须提供的基本服务

    2009-01-04 14:33:00
  • Python实现高效求解素数代码实例

    2023-04-29 16:06:32
  • Python浅析迭代器Iterator的使用

    2023-11-07 12:04:25
  • 一条select语句引起的瓶颈问题思考

    2024-01-18 02:40:32
  • Python 绘图库 Matplotlib 入门教程

    2021-07-21 00:22:07
  • 如何让12px以下的文字最佳显示

    2008-01-24 18:39:00
  • Python字符串拼接、截取及替换方法总结分析

    2023-12-03 14:38:57
  • UTF-8 编码中BOM的检测与删除

    2022-06-04 07:44:16
  • Python MySQLdb Linux下安装笔记

    2024-01-15 14:12:12
  • python实现的简单窗口倒计时界面实例

    2023-06-18 23:02:55
  • python使用SQLAlchemy操作MySQL

    2024-01-16 19:11:11
  • python通过ffmgep从视频中抽帧的方法

    2023-10-02 12:35:39
  • Python学习之集合set

    2021-07-25 10:44:34
  • asp连接mysql数据库详细实现代码

    2012-12-04 19:56:39
  • asp之家 网络编程 m.aspxhome.com