十年網(wǎng)站開發(fā)經(jīng)驗 + 多家企業(yè)客戶 + 靠譜的建站團(tuán)隊
量身定制 + 運(yùn)營維護(hù)+專業(yè)推廣+無憂售后,網(wǎng)站問題一站解決
作者: 何全,github地址: https://github.com/××× QQ交流群: ×××
創(chuàng)新互聯(lián)成立與2013年,是專業(yè)互聯(lián)網(wǎng)技術(shù)服務(wù)公司,擁有項目網(wǎng)站設(shè)計制作、網(wǎng)站制作網(wǎng)站策劃,項目實施與項目整合能力。我們以讓每一個夢想脫穎而出為使命,1280元陽泉做網(wǎng)站,已為上家服務(wù),為陽泉各地企業(yè)和個人服務(wù),聯(lián)系電話:18982081108
通過此教程完成從零入門,能夠獨(dú)立編寫一個簡單的CMDB系統(tǒng)。
目前主流的方法開發(fā)方式,分為2種:mvc 和 mvvc方式。本教程為 mvvc(前后端分離)的入門教程。
教程項目地址: https://github.com/×××/panda/
教程文檔地址: https://github.com/×××/pandaAdmin
主要使用 djangorestframework 模塊,提供 api。 drf 中文文檔 http://drf.jiuyou.info/#/drf/requests
基礎(chǔ)環(huán)境配置 可以看前面的 第一篇 。
mvvc 后端 和mvc 后端,基本配置信息部分差不多,以下是列出不一樣的部分。
django-cors-headers
django-crispy-forms
django-filter
django-pure-pagination
djangorestframework
django-rest-swaggerAUTH_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' # 注釋掉 可以關(guān)閉 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表 添加字段 , 如有需要調(diào)用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='手機(jī)', 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='創(chuàng)建時間', 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.namefrom 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的權(quán)限
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/', 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')}),
('權(quán)限', {'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_headerpip3 install -r requirements.txt ## 安裝所有模塊,如有增加模塊,需要加到這里面
初始化數(shù)據(jù)庫
python3.6 -u /opt/manage.py runserver 192.168.100.99:8000
啟動前端
另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)cdcxhl.cn,海內(nèi)外云服務(wù)器15元起步,三天無理由+7*72小時售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡單易用、服務(wù)可用性高、性價比高”等特點與優(yōu)勢,專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場景需求。