端部の前端と後端とを分離エントリジャンゴ(f)の後にCMDBシステム

端部の前端と後端とを分離エントリジャンゴ(f)の後にCMDBシステム


序文

著者:HE全体、githubのアドレス:https://github.com/ ×××QQ交換基:×××

これは、ゼロからの入門チュートリアルを完了し、簡単なCMDBシステムの独立を書くことができます。

MVCとmvvc方法:現在主流の方式の開発アプローチは、2種類に分けられます。このチュートリアルMVVc(分離前端と後端)チュートリアル。

チュートリアルプロジェクト住所:https://github.com/×××/panda/

チュートリアルドキュメント住所:https://github.com/×××/pandaAdmin

財団

モジュールdjangorestframework主な用途は、APIを提供します。中国の文書DRF http://drf.jiuyou.info/#/drf/requests

基本的な環境設定は、最初の記事の前で見ることができます。

mvvc MVCのバックエンドとバックエンド、基本的な設定情報のほとんどの部分は、以下のリストは、同じ部品ではありません。

  • モジュール
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',)
  • 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=[])),
]

  • 新しいアプリシステム

  • 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

展開

PIP3追加するためのモジュールが増加した場合、必要がある、すべてのモジュールがインストール-r requirements.txtを##インストール

データベースを初期化

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

フロントを開始

おすすめ

転載: blog.51cto.com/hequan/2450628