Django rest framework如何自定義用戶表
說明
Django 默認(rèn)的用戶表 auth_user 包含 id, password, last_login, is_superuser, username, last_name, email, is_staff, is_active, date_joined, first_name 字段。這些基本字段不夠用時(shí),在此基本表上拓展字段是很好選擇。本文介紹在 DRF(Django Rest Framework) 上使用自定義用戶表進(jìn)行接口訪問控制的功能設(shè)計(jì)。
1. Django項(xiàng)目和應(yīng)用創(chuàng)建
先裝必要的模塊
pip install django pip install djangorestframework
創(chuàng)建項(xiàng)目文件夾、項(xiàng)目和應(yīng)用
E:\SweetYaya> mkdir MyProj01 E:\SweetYaya> cd MyProj01 E:\SweetYaya\MyProj01> django-admin startproject MyProj01 . E:\SweetYaya\MyProj01> django-admin startapp MyApp
同步數(shù)據(jù)庫
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
執(zhí)行如下命令后測(cè)試訪問 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 文件,創(chuàng)建繼承自 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 中進(jìn)行定義序列化方法和路由配置
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 ,做如下配置
加入上面創(chuàng)建的應(yīng)用和 rest_framework
INSTALLED_APPS = [
'django.contrib.admin',
...
'rest_framework',
'MyApp',
]
添加全局認(rèn)證設(shè)置
REST_FRAMEWORK = {
'DEFAULT_PERMISSION_CLASSES': [
'rest_framework.permissions.IsAuthenticated'
]
}
修改默認(rèn)用戶表,至此 settings.py 全部配置完成了。
AUTH_USER_MODEL = 'MyApp.UserProfile'
4. 同步數(shù)據(jù)庫
執(zhí)行 makemigrations 命令
E:\SweetYaya\MyProj01> python manage.py makemigrations
Migrations for 'MyApp':
MyApp\migrations\0001_initial.py
- Create model UserProfile
執(zhí)行 migrate 命令出現(xiàn)如下錯(cuò)誤
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 就不報(bào)錯(cuò)了。最后注意把注釋內(nèi)容恢復(fù)回來就好了。
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. 測(cè)試
執(zhí)行命令
E:\SweetYaya\MyProj01>python manage.py runserver
訪問 http://127.0.0.1:8000/users/ 出現(xiàn)結(jié)果如下,此時(shí)表明配置成功,但是尚未進(jìn)行用戶登錄無權(quán)訪問。

6. 命令行注冊(cè)用戶
進(jìn)入 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()
然后在數(shù)據(jù)庫中查看 MyApp_userprofile 表發(fā)現(xiàn)多了兩條記錄,添加成功,繼續(xù)訪問 http://127.0.0.1:8000/users/ 地址,使用用戶密碼登錄可見如下。測(cè)試完成。

到此這篇關(guān)于Django rest framework如何自定義用戶表的文章就介紹到這了,更多相關(guān)Django rest framework自定義用戶表內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Python實(shí)現(xiàn)PPT/PPTX批量轉(zhuǎn)換成PDF
這篇文章主要為大家詳細(xì)介紹了如何使用Python將PowerPoint演示文稿(PPT、PPTX等)轉(zhuǎn)換為PDF文件,使演示內(nèi)容能夠在更多的設(shè)備上展示,感興趣的小伙伴可以了解下2024-01-01
python 打印出所有的對(duì)象/模塊的屬性(實(shí)例代碼)
下面小編就為大家?guī)硪黄猵ython 打印出所有的對(duì)象/模塊的屬性(實(shí)例代碼)。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2016-09-09
python標(biāo)準(zhǔn)庫學(xué)習(xí)之sys模塊詳解
sys模塊是最常用的和python解釋器交互的模塊,sys模塊可供訪問由解釋器(interpreter)使用或維護(hù)的變量和與解釋器進(jìn)行交互的函數(shù),下面這篇文章主要給大家介紹了關(guān)于python標(biāo)準(zhǔn)庫學(xué)習(xí)之sys模塊的相關(guān)資料,需要的朋友可以參考下2022-08-08
深入討論P(yáng)ython函數(shù)的參數(shù)的默認(rèn)值所引發(fā)的問題的原因
這篇文章主要介紹了深入討論P(yáng)ython函數(shù)的參數(shù)的默認(rèn)值所引發(fā)的問題的原因,利用了Python解釋器在內(nèi)存地址分配中的過程解釋了參數(shù)默認(rèn)值帶來陷阱的原因,需要的朋友可以參考下2015-03-03
Python數(shù)據(jù)解析bs4庫使用BeautifulSoup方法示例
這篇文章主要為大家介紹了Python數(shù)據(jù)解析bs4庫使用BeautifulSoup方法示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-08-08
Python解決IndexError: list index out of&nb
IndexError是一種常見的異常類型,它通常發(fā)生在嘗試訪問列表(list)中不存在的索引時(shí),錯(cuò)誤信息“IndexError: list index out of range”意味著你試圖訪問的列表索引超出了列表的實(shí)際范圍,所以本文給大家介紹了Python成功解決IndexError: list index out of range2024-05-05
詳解如何在VS Code中安裝Spire.PDF for Python
這篇文章主要為大家詳細(xì)介紹了如何在VS Code中安裝Spire.PDF for Python,文中的示例代碼簡(jiǎn)潔易懂,有需要的小伙伴可以跟隨小編一起學(xué)習(xí)一下2023-10-10
Python實(shí)現(xiàn)Word文檔樣式批量處理
這篇文章主要為大家詳細(xì)介紹了如何利用Python中的python-docx非標(biāo)準(zhǔn)庫實(shí)現(xiàn)word文檔樣式批量處理,文中示例代碼講解詳細(xì),感興趣的可以了解一下2022-05-05

