Django之入门 CMDB系统 (六) 前后端分离之后端
发表于:2025-12-02 作者:千家信息网编辑
千家信息网最后更新 2025年12月02日,Django之入门 CMDB系统 (六) 前后端分离之后端前言作者: 何全,github地址: https://github.com/××× QQ交流群: ×××通过此教程完成从零入门,能够独立编写一
千家信息网最后更新 2025年12月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安全错误
数据库的锁怎样保障安全
中学网络安全教育备课
汾阳软件开发设计
oracle链接服务器
网络安全等级测评师证书价值
怎么把自己的项目发布到服务器上
app软件开发与设计专业
支付宝中国网络技术有限公司上市
数据库是怎么交互的
c 脱机连接数据库
数据库 顺序查询
服务器管理员名称一般用啥
linux内核 网络安全
技嘉z87p是服务器主板吗
ftp服务器怎么实现全线管理
dsp软件开发的过程
保障网络安全主要包括哪几方面
中科数字出版传媒数据库
ad dhcp服务器
电子商务网络技术调查目的
cts网络安全大赛怎么打
vps服务器制作
互联网营销拾云洞科技
西藏网络安全保护
夸克数据库
mysql数据库设计案例
博兴有软件开发有限公司吗
lterm数据库
烟台有招软件开发工程师
ipv4dns的服务器和网关
在服务器上部署系统