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
文件,創建繼承自 AbstractUser
的 UserProfile
類,給它添加 name
和 mobile
字段,它就是我們自定義的用戶表。
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自定義用戶表內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!
推薦閱讀:
- Django數據庫遷移報錯InconsistentMigrationHistory
- Django migrate報錯的解決方案
- Django創建項目+連通mysql的操作方法
- django如何根據現有數據庫表生成model詳解
- Django一小時寫出賬號密碼管理系統