• 企业400电话
  • 微网小程序
  • AI电话机器人
  • 电商代运营
  • 全 部 栏 目

    企业400电话 网络优化推广 AI电话机器人 呼叫中心 网站建设 商标✡知产 微网小程序 电商运营 彩铃•短信 增值拓展业务
    Django rest framework如何自定义用户表

    说明

    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/ 出现结果如下,此时表明配置成功,但是尚未进行用户登录无权访问。

    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 restframework 框架认证、权限、限流用法示例
    • DjangoRestFramework 使用 simpleJWT 登陆认证完整记录
    • 深度解析Django REST Framework 批量操作
    • Python3+PyCharm+Django+Django REST framework配置与简单开发教程
    • Django REST Framework 分页(Pagination)详解
    • Django restful framework生成API文档过程详解
    • 自定义Django_rest_framework_jwt登陆错误返回的解决
    • django rest framework使用django-filter用法
    • django restframework serializer 增加自定义字段操作
    • Django REST framework 限流功能的使用
    上一篇:如何使用Python提取Chrome浏览器保存的密码
    下一篇:jupyter notebook保存文件默认路径更改方法汇总(亲测可以)
  • 相关文章
  • 

    © 2016-2020 巨人网络通讯 版权所有

    《增值电信业务经营许可证》 苏ICP备15040257号-8

    Django rest framework如何自定义用户表 Django,rest,framework,如何,自定义,