先後端不分離的項目中app咱們通常起名叫app,在先後端分離的項目中咱們通常APP起名叫api,見名知意mysql
在沒有使用app的一些特殊功能時(好比數據庫相關),能夠不用註冊,可是註冊以後,應用的全部應用都能使用,因此咱們將全部的app都完成註冊git
在settings中導入pymysql就能夠,能夠不用去__ init__中導入sql
import pymysql pymysql.install_as_MySQLdb() DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', 'NAME': '數據庫名', 'USER': '帳號', 'PASSWORD': '密碼', 'HOST': '若是是127.0.0.1,該配置能夠省略', "PORT": 3306, # 若是是3306,該配置能夠省略 } }
主路由中,將應用分發給相關在子路由中交給各子路由本身處理數據庫
from django.conf.urls import url, include urlpatterns = [ # ... url(r'^api/', include('api.urls')), # /api/test/ ]
settings.py文件中django
# root就是將文件夾添加到os.path中 MEDIA_ROOT = os.path.join(BASE_DIR, 'media') # url就是配置路由 /路由名/ MEDIA_URL = '/media/'
主路由urls.py下json
from django.views.static import serve from django.conf import settings urlpatterns = [ ... # document_root必須指向icon/001.png所在的路徑=>path變量,能夠進入serve查看 url(r'^media/(?P<path>.*)', serve, {'document_root': settings.MEDIA_ROOT}) ]
一、as_view()方法完成路由配置,返回配置函數 csrf_exempt(view) 中禁用了csrf認證規則後端
因此:全部繼承APIView的子類,都不受csrf認證規則的限制,由於csrf規則對get請求沒有限制,沒有drf本身的好api
二、將請求處理的任務交給dispatch方法瀏覽器
完成了三大核心任務:服務器
一、請求對象的處理:請求解析模塊
二、請求過程的處理:三大認證模塊 => 本身代碼完成處理
三、請求結果的響應:異常模塊處理異常響應 | 響應渲染模塊處理正常響應
二次封裝了Django的wsgi協議的request對象,並作了向下兼容(原來request對象的內容,用如今的request對象都能訪問)
將全部的拼接參數都放在了request.query_params中,將全部的數據包參數都放在了request.data中
路由的有名和無名分組仍是在args和kwargs中
解析模塊能夠自定義在settings.py中自定義配置
REST_FRAMEWORK = { # parsers解析模塊,進入rest_framework中的settings中查找 'DEFAULT_PARSER_CLASSES': [ 'rest_framework.parsers.JSONParser', # 解析json 'rest_framework.parsers.FormParser', # 解析urlencoded 'rest_framework.parsers.MultiPartParser' # 解析form-data ], }
當三大認證模塊和本身處理的視圖邏輯沒有出現異常時,會執行響應渲染模塊
渲染模塊能夠在自定義的settings中自定義配置
REST_FRAMEWORK = { # 渲染模塊 'DEFAULT_RENDERER_CLASSES': [ 'rest_framework.renderers.JSONRenderer', # json數據格式渲染 # 瀏覽器渲染,上線後會註釋,否則瀏覽器請求接口就暴露了後臺語言 'rest_framework.renderers.BrowsableAPIRenderer', ], }
在建立表時,給已經有的表添加新字段有三種方式:1)設置該字段的默認值;2)設置該字段能夠爲空;3)在使用數據庫遷移命令的時候設置默認值
序列化組件 serializers,子類ModelSerializer能夠快速幫咱們建立一個序列化
使用:
一、在models.py中
from django.db import models from django.conf import settings class User(models.Model): name = models.CharField(max_length=64, verbose_name='姓名') height = models.DecimalField(max_digits=5, decimal_places=2, default=0) sex = models.CharField(choices=[('0', '男'), ('1', '女')]) icon = models.ImageField(upload_to='icon', default='icon/default.png') # 自定義序列化給前臺的字段 # property優勢:1)能夠格式化數據庫原有字段的數據 2)能夠對外隱藏原有數據庫原有字段名 3)能夠直接連表操做 @property # 製造插頭 def gender(self): # choices方法獲取值get_xxx_display() return self.get_sex_display() @property def img(self): # 返回url地址 服務器地址+media+具體名 # return 'http://127.0.0.1:8000' + settings.MEDIA_URL + str(self.icon) return settings.BASE_URL + settings.MEDIA_URL + self.icon.name
二、自定義serializers.py文件
from rest_framework import serializers from . import models class UserModelSerializer(serializers.ModelSerializer): class Meta: # 該序列化類是輔助於那個Model類的 model = models.User # 設置參與序列化與反序列化字段 # 插拔式:能夠選擇性返回給前臺字段(插頭都是在Model類中製造) # fields = ['name', 'sex', 'icon'] fields = ['name', 'gender', 'img']
三、在views.py中
from rest_framework.views import APIView from rest_framework.response import Response from . import models, serializers class UserAPIView(APIView): def get(self, request, *args, **kwargs): pk = kwargs.get('pk') if pk: # 單查 # 1)數據庫交互拿到資源obj或資源objs # 2)數據序列化成能夠返回給前臺的json數據 # 3)將json數據返回給前臺 obj = models.User.objects.get(pk=pk) # many操做的數據是否有多個,默認是False能夠不寫 serializer = serializers.UserModelSerializer(obj, many=False) return Response(serializer.data) else: # 羣查 # 1)數據庫交互拿到資源obj或資源objs # 2)數據序列化成能夠返回給前臺的json數據 # 3)將json數據返回給前臺 queryset = models.User.objects.all() # many操做的數據是不是多個 serializer = serializers.UserModelSerializer(queryset, many=True) return Response(serializer.data) def post(self, request, *args, **kwargs): # 單增 # 1)從請求request中得到前臺提交的數據 # 2)將數據轉換成Model對象,並完成數據庫入庫操做 # 3)將入庫成功的對象列化成能夠返回給前臺的json數據(請求與響應數據不對等:請求須要提交密碼,響應必定不展現密碼) # 4)將json數據返回給前臺 return Response()