Django之入门 CMDB系统 (六) 前后端分离之后端
发表于:2026-11-02 作者:千家信息网编辑
千家信息网最后更新 2026年11月02日,Django之入门 CMDB系统 (六) 前后端分离之后端前言作者: 何全,github地址: https://github.com/××× QQ交流群: ×××通过此教程完成从零入门,能够独立编写一
千家信息网最后更新 2026年11月02日Django之入门 CMDB系统 (六) 前后端分离之后端
Django之入门 CMDB系统 (六) 前后端分离之后端
前言
作者: 何全,github地址: https://github.com/××× QQ交流群: ×××
通过此教程完成从零入门,能够独立编写一个简单的CMDB系统。
目前主流的方法开发方式,分为2种:mvc 和 mvvc方式。本教程为 mvvc(前后端分离)的入门教程。
教程项目地址: https://github.com/×××/panda/
教程文档地址: https://github.com/×××/pandaAdmin
基础
主要使用 djangorestframework 模块,提供 api。 drf 中文文档 http://drf.jiuyou.info/#/drf/requests
基础环境配置 可以看前面的 第一篇 。
mvvc 后端 和mvc 后端,基本配置信息部分差不多,以下是列出不一样的部分。
- 模块
django-cors-headersdjango-crispy-formsdjango-filterdjango-pure-paginationdjangorestframeworkdjango-rest-swagger- settings
AUTH_USER_MODEL = 'system.users' #更改user表INSTALLED_APPS = [ 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', 'system.apps.SystemConfig', 'rest_framework', 'rest_framework.authtoken', 'corsheaders', 'django_filters',]MIDDLEWARE = [ 'django.middleware.security.SecurityMiddleware', 'django.contrib.sessions.middleware.SessionMiddleware', 'django.contrib.auth.middleware.AuthenticationMiddleware', 'corsheaders.middleware.CorsMiddleware', 'django.middleware.common.CommonMiddleware', # 'django.middleware.csrf.CsrfViewMiddleware', 'django.contrib.auth.middleware.AuthenticationMiddleware', 'django.contrib.messages.middleware.MessageMiddleware', 'django.middleware.clickjacking.XFrameOptionsMiddleware',]## rest apiREST_FRAMEWORK = { 'DEFAULT_AUTHENTICATION_CLASSES': ( 'rest_framework.authentication.BasicAuthentication', 'rest_framework.authentication.TokenAuthentication', 'rest_framework.authentication.SessionAuthentication', ), 'DEFAULT_RENDERER_CLASSES': ( 'rest_framework.renderers.JSONRenderer', 'rest_framework.renderers.BrowsableAPIRenderer' # 注释掉 可以关闭 api web界面 ), 'DEFAULT_PERMISSION_CLASSES': ( # 'rest_framework.permissions.AllowAny', 'rest_framework.permissions.IsAuthenticated', ), 'DEFAULT_PAGINATION_CLASS': 'rest_framework.pagination.PageNumberPagination', 'PAGE_SIZE': 10, 'DEFAULT_FILTER_BACKENDS': ('django_filters.rest_framework.DjangoFilterBackend',), 'DEFAULT_SCHEMA_CLASS': 'rest_framework.schemas.AutoSchema'}CORS_ALLOW_CREDENTIALS = TrueCORS_ORIGIN_ALLOW_ALL = TrueCORS_ORIGIN_WHITELIST = ( '*',)MIDDLEWARE_CLASSES = ('system.views.DisableCSRFCheck',)- system.views.DisableCSRFCheck
class DisableCSRFCheck(object): def process_request(self, request): setattr(request, '_dont_enforce_csrf_checks', True)- urls.py
from django.contrib import adminfrom django.urls import pathfrom rest_framework.authtoken import viewsfrom rest_framework.documentation import include_docs_urlsfrom django.conf.urls import includeAPI_TITLE = '文档'API_DESCRIPTION = '文档'urlpatterns = [ path('system/', include('system.urls', namespace='system')), path('admin/', admin.site.urls, ), path('token', views.obtain_auth_token), path('docs', include_docs_urls(title=API_TITLE, description=API_DESCRIPTION, authentication_classes=[], permission_classes=[])),]例子
新建app system
- models.py
from django.db import modelsfrom django.contrib.auth.models import AbstractUser, Group, Userclass Users(AbstractUser): """ 基于django表 添加字段 , 如有需要调用user的情况,请使用此表 """ position = models.CharField(max_length=64, verbose_name='职位信息', blank=True, null=True) avatar = models.CharField(max_length=256, verbose_name='头像', blank=True, null=True) mobile = models.CharField(max_length=11, verbose_name='手机', blank=True, null=True) class Meta: db_table = 'users' verbose_name = '用户信息' verbose_name_plural = verbose_name def __str__(self): return self.usernameclass Test(models.Model): date = models.CharField(max_length=96, verbose_name='日期', blank=True, null=True, ) name = models.CharField(max_length=96, verbose_name='姓名', blank=True, null=True, ) address = models.CharField(max_length=96, verbose_name='地址', blank=True, null=True, ) # c_time = models.DateTimeField(auto_now_add=True, null=True, verbose_name='创建时间', blank=True) # u_time = models.DateTimeField(auto_now=True, null=True, verbose_name='更新时间', blank=True) class Meta: db_table = "test" verbose_name = "测试" verbose_name_plural = verbose_name def __str__(self): return self.name- serializers.py
from rest_framework import serializersfrom system.models import Testclass TestSerializer(serializers.ModelSerializer): class Meta: model = Test fields = '__all__'- views.py
class TestList(generics.ListCreateAPIView): queryset = Test.objects.get_queryset().order_by('id') serializer_class = TestSerializer filter_backends = (DjangoFilterBackend, filters.SearchFilter, filters.OrderingFilter) filter_fields = ('id', 'date','name') search_fields = ('id', 'name',) permission_classes = (permissions.DjangoModelPermissions,) # 继承 django的权限class TestDetail(generics.RetrieveUpdateDestroyAPIView): queryset = Test.objects.get_queryset().order_by('id') serializer_class = TestSerializer permission_classes = (permissions.DjangoModelPermissions,)class UserInfo(APIView): """ 获取用户信息 """ permission_classes = (permissions.IsAuthenticated,) def post(self, request): token = (json.loads(request.body))['token'] obj = Token.objects.get(key=token).user result = { 'name': obj.username, 'user_id': obj.id, 'access': list(obj.get_all_permissions()) + ['admin'] if obj.is_superuser else list( obj.get_all_permissions()), 'token': token, 'avatar': '' } return HttpResponse(json.dumps(result))class UserLogout(APIView): permission_classes = (permissions.IsAuthenticated,) def post(self, request): token = (json.loads(request.body))['token'] obj = Token.objects.get(key=token) obj.delete() result = { "status": True } return HttpResponse(json.dumps(result))- urls.py
app_name = "system"urlpatterns = [ path('user_info', UserInfo.as_view()), path('logout', UserLogout.as_view()), path('test', TestList.as_view()), path('test/', TestDetail.as_view())] - admin.py
from django.contrib import adminfrom system.models import Users, Testfrom django.contrib.auth.admin import UserAdminclass UsersAdmin(UserAdmin): fieldsets = ( (None, {'fields': ('username', 'password')}), ('基本信息', {'fields': ('first_name', 'last_name', 'email')}), ('权限', {'fields': ('is_active', 'is_staff', 'is_superuser', 'groups', 'user_permissions')}), ('登录时间', {'fields': ('last_login', 'date_joined')}), ('其他信息', {'fields': ( 'position', 'avatar', 'mobile',)}), ) @classmethod def show_group(self, obj): return [i.name for i in obj.groups.all()] @classmethod def show_user_permissions(self, obj): return [i.name for i in obj.user_permissions.all()] list_display = ('username', 'show_group', 'show_user_permissions') list_display_links = ('username',) search_fields = ('username',) filter_horizontal = ('groups', 'user_permissions')admin.site.register(Users, UsersAdmin)admin.site.register(Test)admin.site.site_header = '管理后台'admin.site.site_title = admin.site.site_header部署
pip3 install -r requirements.txt ## 安装所有模块,如有增加模块,需要加到这里面
初始化数据库
python3.6 -u /opt/manage.py runserver 192.168.100.99:8000
启动前端
信息
教程
地址
文档
模块
时间
系统
基础
方式
权限
用户
配置
差不多
主流
作者
例子
信息部
入门教程
前端
前言
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
互联网高科技
世界互联网领先科技成果
互联网科技logo设计
上海万想互联网科技
科技类的互联网平台
广西拼得多互联网科技有限公司
山东吉时兔互联网科技有限公司
茂名市互联网科技产业园
互联网还是高科技吗
佛山市翊博互联网络科技有限公司
四川慕妮娅互联网科技有限公司
国大互联网教育科技有限公司薪资
合肥互联网科技公司公章图片
厦门江牛科技互联网
广州有谷有贝互联网科技有限公司
互联网科技包装股
唯美互联网科技
承德科技产业互联网平台
互联网企业和网络科技有限公司
株洲百竞科技的互联网营销顾问
瑰夏咖啡
有格互联网科技
关于新基建和互联网科技
天下捷融互联网科技
搜狐科技互联网
国大互联网教育科技有限公司工作
山东子淼互联网科技有限公司
高科技互联网套路
云南省自由互联网科技有限公司
互联网科技股为什么大涨