title: Django_rest framwork聖堂法術
tags: 後端框架,Python,Web開發,Djangorestframework,Django
grammar_cjkRuby: true
---html
跳轉到文章結尾 https://www.cnblogs.com/Asterism-2012/p/10046759.html前端
【工具分享】Django開發,一條命令搭建DRF工程 自動創建完整項目工程-魏泯python
確保django2.0.6版本的環境搭建,環境詳情見 青魔法使魏泯 Django聖堂法術和Python青魔法中收錄。 確保mysql數據庫的安裝, 以及環境變量的配置。
確保本身有Python編程的能力,Django框架的基本知識,Mysql數據庫的使用經驗。mysql
pip install djangorestframework
操做環境web
操做系統: Windows10
Python版本: Python 3.6.5 |Anaconda, Inc.|
IDE: Pycharm
瀏覽器:谷歌瀏覽器sql
Django-rest_framework是幹嗎的?一句話: 用來簡化接口開發的,別問我什麼是接口。好吧,它就是傳輸動態數據的。
這個名字這麼長不太好念,因此就也被稱爲DRF框架,它是一個在django基礎之上進行二次開發的一個先後端分離的web框架,它是嚴格遵照restful API規範的。數據庫
狀態碼(Status Codes)
200,404,500django
DRF框架是用於簡化數據優化與調整的,大大提升了開發速度。DRF作了不少重複性的工做。其中就包括數據序列化:編程
咱們以一個簡單的項目做爲例子,經過一步一步的學習項目的構建,來了解序列化器的使用。這不會耗費不少的時間。
在這個項目中,咱們來簡單瞭解API是如何提供數據的。json
從如今開始,不要複製個人代碼,本身一個字母一個字母的將個人代碼寫入你的Python中。確保它不會出錯,而且觀察它,主動尋找解決問題的辦法。若是你是一個DRF的老手,並以爲個人講解太過詳細的話,這篇文章不適合你。
方式一:經過命令行創建項目(二者選其一)
建立一個名爲demo的示例項目,demo的英文詞義就是例子的意思,以demo爲項目僅僅用於學習相關語法。而不用於線上部署。
E:\Django-codes> django-admin startproject demo
方式二:經過Pycharm自帶功能創建項目
File----New project而後經過配置窗口中的相關設置來利用Pycharm自動建立項目,用這種方法建立的項目,Pycharm會自動配置好應用和模板的初步相關設置。可是不少東西都須要手動去配。
文件位置:[ 當前Console窗口命令行所在的位置 ]
方式一: 使用命令行手動建立則須要這樣:建立一個名爲User的應用。(二者任選其一)
E:\Django-codes\> cd demo E:\Django-codes\demo> python manage.py startapp User
方式二:經過Pycharm自帶功能創建應用
使用Pycharm來建立項目的方式能能夠直接創建app,而且Pycharm會自動會將app加載到setting.py文件中。
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
模板設置也不須要,由於在這個小節中咱們不須要用它。
__init__.py
文件,裝載mysql客戶端。文件位置: [ demo> __init__.py
]
大多數時候,若是不寫這一步,咱們沒法進行模型遷移。若是有興趣能夠試試不進行這一步,瞭解一下會報什麼樣的異常。
import pymysql pymysql.install_as_MySQLdb()
創建數據庫
創建數據庫是必須的。因此,咱們打開在終端中操做:(以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。
文件位置: [ 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
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、使用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)
咱們已經看到了它創建了這麼多表,接下來去創建序列化器吧。這個窗口先不要關。
文件位置[ 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這個名字也不是規定,而是一種規範。
序列化器是能夠脫離數據表模型單獨存在的,它不依賴模型類的存在而存在,它的核心功能是格式化數據。也就是說它也能夠處理咱們本身定義的一些數據。
文件位置[ 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) # 返回序列化後的數據以及狀態碼
文件位置[ demo>urls.py
]
'''上面系統本身生成的內容咱們先忽略掉,下面前兩行的導入模塊是系統本身定義的''' from django.conf.urls import url, include # 導入url與include這兩個包 urlpatterns = [ .... url('^', include('User.urls')), ]
文件位置[ demo>User>urls.py
]
from django.conf.urls import url from . import views urlpatterns = [ url(r'^users/$',views.UsersAPIView.as_view()) ]
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、在地址欄訪問http://127.0.0.1:8000/
,等待頁面的顯示。
是這樣顯示的:
吐槽下本身的網速。
2、在地址欄訪問 http://127.0.0.1:8000/users/
,等待頁面的展現。
能夠在網頁上看到不少信息,好比狀態碼,所使用的表名稱等。在側邊還有一些功能按鈕,但這些按鈕目前沒有什麼用。先不用管它。
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/
,等待頁面的展現。
回顧一下,經過剛纔的練習,咱們製做了最基本的一個API接口網址。爲前端提供數據支持。
在下面的小節裏,一塊兒學習搭建接下來的API的方法吧。