Django之入门 CMDB系统 (六) 前后端分离之后端
发表于:2024-11-23 作者:千家信息网编辑
千家信息网最后更新 2024年11月23日,Django之入门 CMDB系统 (六) 前后端分离之后端前言作者: 何全,github地址: https://github.com/××× QQ交流群: ×××通过此教程完成从零入门,能够独立编写一
千家信息网最后更新 2024年11月23日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安全错误
数据库的锁怎样保障安全
局域网文件存储服务器
电脑网络安全模式进去是黑屏
服务器重启数据库
山西蓝狐网络技术有限公司
奉节诗奉网络技术地址
河马互联网信息科技有限公司
嵊州软件开发联系方式
徐闻手机软件开发
alluxio 数据库
网络安全小学主题队会教案
mybatis连接数据库
七星彩2019年历史开奖数据库
平台运营删除数据库事件
苹果手机防盗软件开发
vip数据库中使用的逻辑组配符
软件开发技术学多久6
网络安全和信息化工作考核
数据库设计专业排名
程序文件是否可以备份到服务器
电大 数据库应用技术
怎么查看数据库是否有备库
软件开发 输出物
地形图地类和数据库不符
金蝶k3数据库如何查询修改凭证
西甲数据库
网络技术入门经典教程
网络安全行业有哪些产品
数据库设计专业排名
国家数据库广西汽车保有量
ftp 服务器 添加用户