The CMDB system after entry Django (f) separating the front and rear ends of the end

The CMDB system after entry Django (f) separating the front and rear ends of the end


Foreword

Author: HE whole, github address: https://github.com/ ××× QQ exchange group: ×××

This completes the getting started tutorial from zero, be able to write a simple CMDB system independent.

The current mainstream method development approach, is divided into two kinds: mvc and mvvc way. This tutorial MVVc (separated front and rear ends) Tutorial.

Tutorial Project Address: https://github.com/×××/panda/

Tutorial documentation Address: https://github.com/×××/pandaAdmin

basis

The main use djangorestframework module provides api. drf Chinese document http://drf.jiuyou.info/#/drf/requests

Basic environment configuration can be seen in front of the first article.

mvvc mvc back-end and back-end, almost part of the basic configuration information, the following list is not the same part.

  • Module
django-cors-headers
django-crispy-forms
django-filter
django-pure-pagination
djangorestframework
django-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 api
REST_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 = True
CORS_ORIGIN_ALLOW_ALL = True
CORS_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 admin
from django.urls import path
from rest_framework.authtoken import views
from rest_framework.documentation import include_docs_urls
from django.conf.urls import include

API_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=[])),
]

example

  • New app system

  • models.py
from django.db import models
from django.contrib.auth.models import AbstractUser, Group, User

class 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.username

class 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 serializers
from system.models import Test

class 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/<int:pk>', TestDetail.as_view())
]
  • admin.py
from django.contrib import admin
from system.models import Users, Test
from django.contrib.auth.admin import UserAdmin

class 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

deploy

pip3 install -r requirements.txt ## all the modules installed, if the module increases, there is need for added

Initialize the database

python3.6 -u /opt/manage.py runserver 192.168.100.99:8000

Start the front

Guess you like

Origin blog.51cto.com/hequan/2450628