Django之入门 CMDB系统 (六) 前后端分离之后端
发表于:2024-10-07 作者:千家信息网编辑
千家信息网最后更新 2024年10月07日,Django之入门 CMDB系统 (六) 前后端分离之后端前言作者: 何全,github地址: https://github.com/××× QQ交流群: ×××通过此教程完成从零入门,能够独立编写一
千家信息网最后更新 2024年10月07日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安全错误
数据库的锁怎样保障安全
网易手机版怎样开服务器
网络安全处于什么状态
三级数据库技术经验
软件开发绩效考核只扣不奖
亚马逊互联网科技有限公司
哪家公司提供安卓软件开发
软件开发公司核心竞争力
数据库系统=db
软件开发相关词汇
v服务器地址哪个好
软件开发师有几个职称
软件工程常用软件开发方法
一百字网络安全我能行稿子
软件开发 航空航天 风险
中博网络技术有限公司
许昌oa软件开发
网络技术高手叫什么
常采用的网络安全技术
数据库数据更新和维护由什么负责
h5软件开发交流群
渭河流域基础地理数据库
sql数据库修改某张表的长度
系统识别不了数据库如何处理
590分理科想学软件开发
深圳智能建模软件开发
微信软件开发买断后创业
信息学院校园网络安全性分析
搜索dota2协调服务器
数据库进销存开发
网络安全上班时间