青魔法聖堂法術 Django REST framework (DRF) 框架(持續更新)


title: Django_rest framwork聖堂法術
tags: 後端框架,Python,Web開發,Djangorestframework,Django
grammar_cjkRuby: true
---html

著名的Python高階法術 DRF (Django REST framework)框架究竟是作什麼用的?

跳轉到文章結尾 https://www.cnblogs.com/Asterism-2012/p/10046759.html前端

目錄

【工具分享】Django開發,一條命令搭建DRF工程 自動創建完整項目工程-魏泯python

從入門開始學習Django-rest-framework(簡稱DRF)- 魏泯 【完整源代碼】

確保django2.0.6版本的環境搭建,環境詳情見 青魔法使魏泯 Django聖堂法術和Python青魔法中收錄。 確保mysql數據庫的安裝, 以及環境變量的配置。
確保本身有Python編程的能力,Django框架的基本知識,Mysql數據庫的使用經驗。mysql

  • 安裝djangorestframework模塊。
pip install djangorestframework
  • 操做環境web

    操做系統: Windows10
    Python版本: Python 3.6.5 |Anaconda, Inc.|
    IDE: Pycharm
    瀏覽器:谷歌瀏覽器sql

第一節 初探Django-rest-framework-魏泯

Django-rest_framework介紹

Django-rest_framework是幹嗎的?一句話: 用來簡化接口開發的,別問我什麼是接口。好吧,它就是傳輸動態數據的。
這個名字這麼長不太好念,因此就也被稱爲DRF框架,它是一個在django基礎之上進行二次開發的一個先後端分離的web框架,它是嚴格遵照restful API規範的。數據庫

  • 問題一:先後端分離與不分離的概念是什麼?(這裏不贅述。網上查查就有不少概念)。
  • 問題二:什麼是restful API 規範?
    1. 輕量級,通常經過http或者https協議,不須要額外的協議!經常使用的方法post,get,put,delete,(patch,options不經常使用)
    2. 面向資源,一目瞭然,具備意義(增刪改查,都是動詞,可是URI裏要求是名詞)
      GET /zoos:列出全部動物園
      POST /zoos:新建一個動物園
      GET /zoos/ID:獲取某個指定動物園的信息
      PUT /zoos/ID:更新某個指定動物園的信息(提供該動物園的所有信息)
    3. 通常經過json或者xml
    4. 版本(Versioning)應該將API的版本號放入URL。
      http://www.example.com/app/1.0/foo
      http://www.example.com/app/1.1/foo
    5. 狀態碼(Status Codes)
      200,404,500django

      DRF框架是用於簡化數據優化與調整的,大大提升了開發速度。DRF作了不少重複性的工做。其中就包括數據序列化:編程

  • 問題三: 什麼是序列化呢,我不序列化行不行?
    1. 序列化(encoding):把python對象編碼轉換成Json字符串。
    2. 反序列化(decoding):把json格式字符串解碼爲python對象。
      說白了就是對咱們要的數據進行格式化編碼,用於傳輸到須要它的地方。若是不瞭解編碼,我推薦去張雪峯老師的Python3教程上查閱「編碼」的內容,能夠很好的幫助瞭解編碼的由來與做用。
  • 還有: 別問我什麼是數據了,我不告訴你┭┮﹏┭┮。
  • 問題怎麼這麼多...別想那麼遠啦

實戰DRF(Django-rest-framework)-【完整源代碼】!

咱們以一個簡單的項目做爲例子,經過一步一步的學習項目的構建,來了解序列化器的使用。這不會耗費不少的時間。
在這個項目中,咱們來簡單瞭解API是如何提供數據的。json

從如今開始,不要複製個人代碼,本身一個字母一個字母的將個人代碼寫入你的Python中。確保它不會出錯,而且觀察它,主動尋找解決問題的辦法。若是你是一個DRF的老手,並以爲個人講解太過詳細的話,這篇文章不適合你。

  1. 創建django項目
    文件位置: [ 當前Console窗口命令行所在的位置 ]

方式一:經過命令行創建項目(二者選其一)
建立一個名爲demo的示例項目,demo的英文詞義就是例子的意思,以demo爲項目僅僅用於學習相關語法。而不用於線上部署。

E:\Django-codes> django-admin startproject demo

方式二:經過Pycharm自帶功能創建項目

File----New project而後經過配置窗口中的相關設置來利用Pycharm自動建立項目,用這種方法建立的項目,Pycharm會自動配置好應用和模板的初步相關設置。可是不少東西都須要手動去配。

  1. 建立應用

文件位置:[ 當前Console窗口命令行所在的位置 ]
方式一: 使用命令行手動建立則須要這樣:建立一個名爲User的應用。(二者任選其一)

E:\Django-codes\> cd demo
E:\Django-codes\demo> python manage.py startapp User

方式二:經過Pycharm自帶功能創建應用

使用Pycharm來建立項目的方式能能夠直接創建app,而且Pycharm會自動會將app加載到setting.py文件中。

  1. 配置項目 setting.py

文件位置: [ demo> setting.py ]

安裝應用

INSTALLED_APPS = [
    '''INSTALLED_APPS中系統默認的內容跟咱們先簡略掉,爲了讓你們可以更加專一清晰地看到咱們本身本身手動添加了哪些東西'''
    'User.apps.UserConfig',     # 安裝應用
    'rest_framework',   # 安裝rest_framework
]

以Mysql數據庫做爲例子,因此在本例中我會配置mysql的交互信息。這些相關參數都是填本身的,這裏不講解mysql的交互參數,在註釋中都有。這都是基礎知識。

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'drf_demo',     # 數據庫名稱(這個要提早創建好)
        'USER': 'root',     # 服務器端管理員名稱默認爲root
        'PASSWORD': '本身的密碼',    # 這裏填寫本身的密碼
        'HOST': 'localhost',    # 或者127.0.0.1
        'PORT': 3306,
    }
}

本地化設置(語言與時間),是可選的。在本例中,設置或不設置都行,絲絕不影響學習進度與頁面效果。這就是爲了回憶下Django開發的平常。

LANGUAGE_CODE = 'zh-hans'

TIME_ZONE = 'Asia/Shanghai'

USE_I18N = True

USE_L10N = True

USE_TZ = False

模板設置也不須要,由於在這個小節中咱們不須要用它。

  1. 配項目根級目錄的__init__.py文件,裝載mysql客戶端。

文件位置: [ demo> __init__.py ]

大多數時候,若是不寫這一步,咱們沒法進行模型遷移。若是有興趣能夠試試不進行這一步,瞭解一下會報什麼樣的異常。

import pymysql
pymysql.install_as_MySQLdb()
  1. 創建數據庫

    創建數據庫是必須的。因此,咱們打開在終端中操做:(以windows爲例,快捷鍵Win+R 輸入cmd 而後回車)

C:\>mysql -uroot -p
Enter password: *****

密碼輸入正確後是顯示這樣的提示:

Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 1040
Server version: 5.7.19-log MySQL Community Server (GPL)

Copyright (c) 2000, 2017, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql>

建立數據庫drf_demo,指定字符集爲utf-8,sql語句中「utf-8」寫做「utf8」。

mysql>create databases drf_demo charset=utf8;
Query OK, 1 row affected (0.01 sec)

建立成功則會顯示Query OK。

  1. 設計模型類

文件位置: [ demo> User> Models.py ]
模型類的字段按照個人示例代碼來寫,便於第二節的學習。

'''django已經爲咱們引入models'''
class User(models.Model):   # 創建User表,包含幾個字段
    '''字段名稱 = models.字段類型(字段參數)'''
    nick_name = models.CharField(max_length=20, verbose_name='暱稱')
    add_time = models.DateField(auto_now_add=True, verbose_name='建立時間')
    gender = models.BooleanField(default=True, verbose_name='性別')
    image = models.ImageField(upload_to='media', verbose_name='圖片', null=True)
    mobile = models.CharField(max_length=11, verbose_name='手機號', null=True)
    
    
    '''下面的元類和魔法方法能夠不定義,絲絕不影響數據表的健全性能'''
    class Meta:     # 定義元類
        db_table = 'users'   # 定義未來遷移數據模型時,生成的表名
        verbose_name_plural = '用戶'
    def __str__(self): 
        '''這裏return什麼都行,就是一個標識,寫字符串也能夠。魔法方法,str。爲每一條記錄返回對應暱稱'''
        return self.name
  1. 遷移數據庫
    第一步:生成遷移(文件)
E:\Django-codes\demo> python manage.py makemigrations

這條命令啓動以後,Django框架會爲咱們生成一個文件,存放在項目根目錄下的「migrations」文件夾中,名爲「0001_initial.py」。
建立成功會顯示這樣的提示:

Migrations for 'User':
  User\migrations\0001_initial.py
    - Create model User

它用於爲咱們生成而且執行對應的sql語句,與數據庫進行直接交互。

第二步:執行遷移

E:\Django-codes\demo> python manage.py migrate

成功會顯示:

Performing system checks...

System check identified no issues (0 silenced).

You have 14 unapplied migration(s). Your project may not work properly until you apply the migrations for app(s): admin, auth, contenttypes, sessions.
Run 'python manage.py migrate' to apply them.
November 09, 2018 - 13:54:09
Django version 2.0.6, using settings 'demo10.settings'
Starting development server at http://127.0.0.1:8000/
Quit the server with CTRL-BREAK.

(Py_Django2.0.6) E:\PyAsterism\DRF-codes\demo10>python manage.py makemigrations
Migrations for 'User':
  User\migrations\0001_initial.py
    - Create model User

(Py_Django2.0.6) E:\PyAsterism\DRF-codes\demo10>python manage.py migrate
Operations to perform:
  Apply all migrations: User, admin, auth, contenttypes, sessions
Running migrations:
  Applying User.0001_initial... OK
  Applying contenttypes.0001_initial... OK
  Applying auth.0001_initial... OK
  Applying admin.0001_initial... OK
  Applying admin.0002_logentry_remove_auto_add... OK
  Applying contenttypes.0002_remove_content_type_name... OK
  Applying auth.0002_alter_permission_name_max_length... OK
  Applying auth.0003_alter_user_email_max_length... OK
  Applying auth.0004_alter_user_username_opts... OK
  Applying auth.0005_alter_user_last_login_null... OK
  Applying auth.0006_require_contenttypes_0002... OK
  Applying auth.0007_alter_validators_add_error_messages... OK
  Applying auth.0008_alter_user_username_max_length... OK
  Applying auth.0009_alter_user_last_name_max_length... OK
  Applying sessions.0001_initial... OK

這時候Django就在MySQL數據庫中建立數據表了(在drf_demo庫中)。

  1. 查詢數據庫

這一步是可選的,主要是看看它到底創建沒創建數據表;
1、使用drf_demo數據庫:

mysql> use drf_demo;

成功則顯示:

Database changed

2、查看數據表:

mysql> show tables;

成功則顯示:

+----------------------------+
| Tables_in_drf_demo10       |
+----------------------------+
| auth_group                 |
| auth_group_permissions     |
| auth_permission            |
| auth_user                  |
| auth_user_groups           |
| auth_user_user_permissions |
| django_admin_log           |
| django_content_type        |
| django_migrations          |
| django_session             |
| users                      |
+----------------------------+
11 rows in set (0.00 sec)

咱們已經看到了它創建了這麼多表,接下來去創建序列化器吧。這個窗口先不要關。

  1. 設置序列化器

文件位置[ demo> User> serializers.py ]
設計序列化器要根據本身的需求進行設置,它能夠理解爲一種規則。

from rest_framework import serializers      # 導入serializers


class Userserializers(serializers.Serializer):
    nick_name = serializers.CharField(max_length=20, required=True)    # 這裏的字段類型屬性並不和Models徹底一直,要留心觀察其中的區別
    gender = serializers.BooleanField(default=0, required=False)       # required 意爲‘該字段必須填寫’ 它的默認值是True
    image = serializers.ImageField(required=False)
    add_time = serializers.DateField(required=False)
    mobile = serializers.CharField(max_length=11, required=False)

注意:這個文件名是咱們手動建立的,並且serializers這個名字也不是規定,而是一種規範。
序列化器是能夠脫離數據表模型單獨存在的,它不依賴模型類的存在而存在,它的核心功能是格式化數據。也就是說它也能夠處理咱們本身定義的一些數據。

  1. 設置視圖

文件位置[ demo> User> Views.py ]

from rest_framework.views import APIView    # 導入APIView視圖
from .models import UsersModels     # 引入數據模型類
from rest_framework.response import Response    # 導入drf框架提供的Response
from rest_framework import status       # 狀態碼

'''定義視圖'''
class UsersAPIViews(APIView):   # 繼承APIView
    def get(self, request):     # request是必填參數
        users = UsersModels.objects.all()       # 獲取數據庫中全部的數據
        ser = UsersSerializers(instance=users, many=True)       # many=True 表示序列化器接收多條數據
        return Response(ser.data, status=status.HTTP_200_OK)    # 返回序列化後的數據以及狀態碼
  1. 主路由定義

文件位置[ demo>urls.py ]

'''上面系統本身生成的內容咱們先忽略掉,下面前兩行的導入模塊是系統本身定義的'''
from django.conf.urls import url, include       # 導入url與include這兩個包
urlpatterns = [
    ....
    url('^', include('User.urls')),
]
  1. 子路由定義 遵循restful api規範協定,名詞定義用複數形式 如zoo,則寫成zoos

文件位置[ demo>User>urls.py ]

from django.conf.urls import url
from . import views

urlpatterns = [
    url(r'^users/$',views.UsersAPIView.as_view())
]
  1. 運行項目
E:\Django-codes\demo> python manage.py runserver

成功會顯示這樣的提示:

Performing system checks...

System check identified no issues (0 silenced).
November 08, 2018 - 08:55:44
Django version 2.0.6, using settings 'demo30.settings'
Starting development server at http://127.0.0.1:8000/
Quit the server with CTRL-BREAK.
  1. 打開谷歌瀏覽器

1、在地址欄訪問http://127.0.0.1:8000/,等待頁面的顯示。
是這樣顯示的:

吐槽下本身的網速。

2、在地址欄訪問 http://127.0.0.1:8000/users/,等待頁面的展現。

能夠在網頁上看到不少信息,好比狀態碼,所使用的表名稱等。在側邊還有一些功能按鈕,但這些按鈕目前沒有什麼用。先不用管它。

  1. 增長數據,而後刷新頁面。
    咱們看到頁面上的「[]」中什麼都沒有顯示,那是由於咱們的User表中尚未任何的數據。
    1、切換到剛纔打開的cmd中,操做MySQL查看錶結構
mysql> desc users;

成功顯示:

+-----------+--------------+------+-----+---------+----------------+
| Field     | Type         | Null | Key | Default | Extra          |
+-----------+--------------+------+-----+---------+----------------+
| id        | int(11)      | NO   | PRI | NULL    | auto_increment |
| nick_name | varchar(20)  | NO   |     | NULL    |                |
| gender    | tinyint(1)   | NO   |     | NULL    |                |
| image     | varchar(100) | YES  |     | NULL    |                |
| add_time  | date         | YES  |     | NULL    |                |
| mobile    | varchar(11)  | NO   |     | NULL    |                |
+-----------+--------------+------+-----+---------+----------------+
6 rows in set (0.01 sec)

2、插入數據

mysql> insert into drf_demo10.users
    -> (id, nick_name, gender, image, add_time, mobile)
    -> values
    -> (1, "王司徒", 1, null, "2018-11-09", "13000000000");

成功則顯示:

Query OK, 1 row affected (0.01 sec)

3、查看數據庫

mysql> select * from drf_demo10.users;

成功會顯示:

+----+-----------+--------+-------+------------+-------------+
| id | nick_name | gender | image | add_time   | mobile      |
+----+-----------+--------+-------+------------+-------------+
|  1 | 王司徒    |      1 | NULL  | 2018-11-09 | 13000000000 |
+----+-----------+--------+-------+------------+-------------+
1 row in set (0.00 sec)

4、瀏覽器訪問 http://127.0.0.1:8000/users/,等待頁面的展現。

  1. 第一小節結束

回顧一下,經過剛纔的練習,咱們製做了最基本的一個API接口網址。爲前端提供數據支持。
在下面的小節裏,一塊兒學習搭建接下來的API的方法吧。

返回目錄再看看

相關文章
相關標籤/搜索