做者: 何全,github地址: https://github.com/××× QQ交流羣: ×××前端
經過此教程完成從零入門,可以獨立編寫一個簡單的CMDB系統。python
目前主流的方法開發方式,分爲2種:mvc 和 mvvc方式。本教程爲 mvvc(先後端分離)的入門教程。git
教程項目地址: https://github.com/×××/panda/github
教程文檔地址: https://github.com/×××/pandaAdminweb
主要使用 djangorestframework 模塊,提供 api。 drf 中文文檔 http://drf.jiuyou.info/#/drf/requests數據庫
基礎環境配置 能夠看前面的 第一篇 。django
mvvc 後端 和mvc 後端,基本配置信息部分差很少,如下是列出不同的部分。json
django-cors-headers django-crispy-forms django-filter django-pure-pagination djangorestframework django-rest-swagger
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',)
class DisableCSRFCheck(object): def process_request(self, request): setattr(request, '_dont_enforce_csrf_checks', True)
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=[])), ]
新建app system後端
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
from rest_framework import serializers from system.models import Test class TestSerializer(serializers.ModelSerializer): class Meta: model = Test fields = '__all__'
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))
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()) ]
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
pip3 install -r requirements.txt ## 安裝全部模塊,若有增長模塊,須要加到這裏面api
初始化數據庫
python3.6 -u /opt/manage.py runserver 192.168.100.99:8000
啓動前端