初识Django —Python API接口编程入门
初識(shí)Django
—Python API接口編程入門(mén)
一、WEB架構(gòu)的簡(jiǎn)單介紹
Django是什么?
Django是一個(gè)開(kāi)放源代碼的Web應(yīng)用框架,由Python寫(xiě)成。我們的目標(biāo)是用Python語(yǔ)言,基于Django框架,利用MVC模型,實(shí)現(xiàn)后臺(tái)方面的針對(duì)數(shù)據(jù)庫(kù)的API開(kāi)發(fā)。先了解一下互聯(lián)網(wǎng)的WEB架構(gòu),
如上圖:
互聯(lián)網(wǎng)的WEB架構(gòu)大致分為三層,web層、app層和數(shù)據(jù)庫(kù)層。Web層:如apache網(wǎng)站服務(wù)器;app層主要是應(yīng)用業(yè)務(wù);DB指后臺(tái)數(shù)據(jù)庫(kù)。隨著互聯(lián)網(wǎng)的高速發(fā)展,網(wǎng)站訪問(wèn)量的增長(zhǎng)、數(shù)據(jù)的累積、負(fù)載的過(guò)高,應(yīng)用和數(shù)據(jù)庫(kù)的設(shè)計(jì)也面臨了更多的挑戰(zhàn)。業(yè)務(wù)的拆分、數(shù)據(jù)庫(kù)的切分已不是什么新名詞。為了方便日后系統(tǒng)的平滑擴(kuò)展,我們?cè)谙到y(tǒng)設(shè)計(jì)的時(shí)候就需要規(guī)劃好APP業(yè)務(wù)實(shí)現(xiàn)模式。在這里,我們?cè)O(shè)計(jì)的APP也分為前臺(tái)和后臺(tái),前臺(tái)主要是展現(xiàn),如界面、FORM等,后臺(tái)為API接口,用來(lái)聯(lián)系前臺(tái)界面和數(shù)據(jù)庫(kù)的交互,本文只涉及到APP設(shè)計(jì)中的后臺(tái)API接口設(shè)計(jì)和用Python實(shí)現(xiàn)的部分。
?
當(dāng)然一個(gè)項(xiàng)目的開(kāi)發(fā)離不開(kāi)團(tuán)隊(duì)的合作,我們用GitLab來(lái)做開(kāi)發(fā)代碼的版本管理,關(guān)于git的安裝和使用本文不以說(shuō)明。
二、開(kāi)發(fā)環(huán)境搭建
1、安裝Python2.8
2、安裝Django模塊
3、Python開(kāi)發(fā)編輯器PyCharm
有了以上環(huán)境,我們就可以開(kāi)工了,數(shù)據(jù)庫(kù)可以直接用Sqlite,如果用mysql的話要安裝mysqldb模塊。
?
三、模塊設(shè)計(jì)要求
新人報(bào)道,先到項(xiàng)目組領(lǐng)個(gè)接口開(kāi)發(fā)任務(wù)吧。
項(xiàng)目組分配任務(wù):完成XX數(shù)據(jù)模型的接口設(shè)計(jì)
涉及到的表有:XX_TAB
涉及到的API接口有:
1、list,獲取XX_TAB表數(shù)據(jù),傳入?yún)?shù)XX_ID,從數(shù)據(jù)庫(kù)中列出XX_ID相同的行。
2、add,刪除XX_TAB表一行數(shù)據(jù),傳入PK_ID、XX_ID
3、update,更新XX_TAB表一行數(shù)據(jù),傳入PK_ID、XX_ID
4、delete,刪除XX_TAB表一行數(shù)據(jù),傳入PK_ID、XX_ID
說(shuō)白了就是在應(yīng)用層實(shí)現(xiàn)對(duì)XX_TAB標(biāo)的查詢和增刪改操作,以用于前臺(tái)APP的調(diào)用,前臺(tái)APP不直接針對(duì)數(shù)據(jù)庫(kù)做任何操作,由調(diào)用API接口來(lái)實(shí)現(xiàn)對(duì)數(shù)據(jù)庫(kù)的查詢、增刪改。這樣設(shè)計(jì)的目的是降低業(yè)務(wù)模塊間的耦合性,提高APP和數(shù)據(jù)庫(kù)的靈活性,便于以后業(yè)務(wù)的升級(jí)變更,也是考慮到今后數(shù)據(jù)庫(kù)數(shù)據(jù)量的增長(zhǎng)而便于數(shù)據(jù)庫(kù)的拆分和平滑擴(kuò)展。
?
四、實(shí)際開(kāi)發(fā)
1、Django基本格式介紹
前面已經(jīng)說(shuō)過(guò),我們是團(tuán)隊(duì)開(kāi)發(fā)的,先將同學(xué)們?cè)趃it上已寫(xiě)得代碼pull下來(lái),第一次下載代碼,我是用git clone的命令復(fù)制到本地的,如下:
git clone http://git.xxx.cn/xxxtest/xxx.git
cd xxxtest? #cd到項(xiàng)目目錄下
python manage.py runserver 127.0.0.1:8000? #啟動(dòng)項(xiàng)目
注意:我是用git下載的代碼,不是自己新建的project。如果同學(xué)們是新建項(xiàng)目的話,還需按部就班從django-admin.py startproject [project_name]開(kāi)始。
創(chuàng)建完項(xiàng)目后,Django框架會(huì)自動(dòng)生成一些文件和文件夾,注意settings.py文件,關(guān)于數(shù)據(jù)庫(kù)設(shè)置處,默認(rèn)如下代碼:
| DATABASES?= { |
在命令行下運(yùn)行python manage.py runserver命令后,在項(xiàng)目文件下會(huì)自動(dòng)生成一個(gè)db.sqlite3數(shù)據(jù)文件,Django默認(rèn)數(shù)據(jù)庫(kù)為sqlite,可改成MySQL、Oracle、PG等,具體設(shè)置如MySQL如下:
| DATABASES = { ??? 'default': { ??????? 'ENGINE': 'django.db.backends.mysql', ??????? 'NAME': 'test', ??????? 'USER': 'test', ??????? 'PASSWORD': 'test123', ??????? 'HOST':'localhost', ??????? 'PORT':'3306', ??? } } |
了解了數(shù)據(jù)庫(kù)的配置,我們還需要了解一下項(xiàng)目目錄下的主要幾個(gè)文件:
PROJECT_NAME: 項(xiàng)目的容器。
manage.py: 一個(gè)實(shí)用的命令行工具,可讓你以各種方式與該 Django 項(xiàng)目進(jìn)行交互。
[PROJECT_NAME]/__init__.py: 一個(gè)空文件,告訴 Python 該目錄是一個(gè) Python 包。
[PROJECT_NAME]/settings.py: 該 Django 項(xiàng)目的設(shè)置/配置。
[PROJECT_NAME]/urls.py: 該 Django 項(xiàng)目的 URL 聲明; 一份由 Django 驅(qū)動(dòng)的網(wǎng)站"目錄"。
[PROJECT_NAME]/wsgi.py: 一個(gè) WSGI 兼容的 Web 服務(wù)器的入口,以便運(yùn)行你的項(xiàng)目。
上面是每個(gè)項(xiàng)目的通用介紹,回到實(shí)際的開(kāi)發(fā)中來(lái)。
2、新建app和表定義
我們現(xiàn)在已經(jīng)有了項(xiàng)目,我要做的是某個(gè)表的api接口,于是我在項(xiàng)目下新建了一個(gè)app,新建app用以下命令:
django-admin startapp ?xx_tab
這樣我們就新建了一個(gè)xx_tab命名的app,我們要做一些修改:
1、還是打開(kāi)settings.py文件,找到INSTALLED_APPS參數(shù),在最后面加入xx_tab的app名,如下:| INSTALLED_APPS = [ 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', 'rest_framework_swagger', 'rest_framework', 'rest_framework_jwt', 'xx_tab’, ] |
2、修改xx_tab目錄下得而models.py文件,定義我們需要建的表
| # Create your models here. class Xx_Tab(models.Model): pk_id = models.AutoField(primary_key=True) xx_id = models.IntegerField() xx_name = models.CharField(max_length=200) |
?
3、修改url
完成數(shù)據(jù)庫(kù)表的定義后,考慮到使用http來(lái)訪問(wèn)數(shù)據(jù)庫(kù)的,那就離不開(kāi)http的url地址。前面在文件介紹中說(shuō)過(guò)用django-admin.py startproject [project_name]命令生成項(xiàng)目后,在項(xiàng)目層目錄下會(huì)有url的python文件,在每個(gè)項(xiàng)目下用django-admin startapp ?xx_tab命令生成的app中也會(huì)有url的python文件,url好比是網(wǎng)站網(wǎng)頁(yè)的目錄,是用來(lái)在web界面上訪問(wèn)的地址。一般,url會(huì)對(duì)于view,view好比是網(wǎng)頁(yè),url指向view。
項(xiàng)目rul、app rul和app view之間的調(diào)用關(guān)系,如下圖:
?
Project rul格式:
| # 幾個(gè)測(cè)試接口 router = routers.DefaultRouter() ? urlpatterns = [ url('^hello/$', hello), url('^simple/$', Simple.as_view()), ? url( r'/log/', include(xx_tab.urls')), ] |
App rul格式
| urlpatterns = [ url(r'list/$', views.get_xx_tabs,), url(r'detail/([0-9]+)$', views.get_xx_tab), url(r'delete/([0-9]+)$', views.delete_xx_tab), url(r'update/([0-9]+)$', views.update_xx_tab), url(r'add/$', views.add_xx_tab), ] |
以上是兩層url調(diào)用舉例:
url在瀏覽器中的完整寫(xiě)法應(yīng)該如下:
http://127.0.0.1/xx_tab/list/?xx_id=1
4、用Django生成數(shù)據(jù)庫(kù)中的表
完成了在Django框架models.py文件中定義了xx_tab表的相關(guān)信息,我們就可以用django命令來(lái)生成表。
python manage.py makemigrations xx_tab
注意:xx_tab是app名,此命令會(huì)在xx_tab app下migrations目錄下生成一個(gè)0001_initial.py文件,此文件定義了建表信息,如果發(fā)現(xiàn)表定義有問(wèn)題,在修改models.py中的定義后,需要?jiǎng)h除0001_initial.py文件,重跑python manage.py makemigrations xx_tab,重新生成0001_initial.py。
執(zhí)行python manage.py migrate xx_tab,在數(shù)據(jù)庫(kù)中生成xx_tab表。
打開(kāi)Sqlite數(shù)據(jù)庫(kù),在windows下可用
d:\dt\sqlite\sqlite3.exe db.sqlite3 打開(kāi)當(dāng)前的數(shù)據(jù)庫(kù),sqlite3.exe可在網(wǎng)上下載。
.table可查看當(dāng)前的表。
.schema tab_name 可查看表結(jié)構(gòu)定義。
5、API接口,實(shí)現(xiàn)ADD單行數(shù)據(jù)
我們要模擬從前臺(tái)發(fā)出一個(gè)get或post請(qǐng)求,調(diào)用要寫(xiě)的api接口實(shí)現(xiàn)插入數(shù)據(jù)庫(kù)的功能,
如下界面,模擬前臺(tái)調(diào)用
?
?
?
上面是一個(gè)插入演示頁(yè)面,post相關(guān)表字段值,完成對(duì)數(shù)據(jù)庫(kù)的一行數(shù)據(jù)插入。
完成這已插入過(guò)程的邏輯關(guān)系如下:
?
View.py主要是接收前臺(tái)post過(guò)來(lái)的數(shù)據(jù),并在完成處理、存儲(chǔ)后返回相關(guān)信息。
Service.py主要處理數(shù)據(jù),格式化數(shù)據(jù)
數(shù)據(jù)庫(kù)接口層主要處理對(duì)數(shù)據(jù)庫(kù)的數(shù)據(jù)存儲(chǔ)和訪問(wèn)。
view.py
開(kāi)頭,以下這幾行是必不可少的
# -*- coding: utf-8 -*- from rest_framework import statusfrom rest_framework.decorators import api_view
from rest_framework.response import Response
?
因?yàn)樵趗rls.py中我們定義的是url(r'add/$', views.add_xx_tab)
add指向views.add_xx_tab
所以我們?cè)趘iews中需要定義add_xx_tab函數(shù)
?
@api_view(['POST', 'GET'])def xx_tab_add(request, *args): ????????? #1、接收request數(shù)據(jù) #2、處理數(shù)據(jù)
#3、返回結(jié)果 ?
基于django rest_framework,在處理client http request時(shí)需要用到@api_view修飾。
同時(shí),我們也需要弄清楚對(duì)于從client端GET或POST過(guò)來(lái)的數(shù)據(jù)我們?cè)趺刺幚怼?/p>
#1、接收request數(shù)據(jù)
| if request.method == 'GET': ??? do_something() elif request.method == 'POST': ??? do_something_else() |
如果是GET,需要處理request .query_params;如果是post需要處理request .data
| if request.method == 'GET': for k in request .query_params: ?? dict[k] = request .query_params[k] return dict elif request.method == 'POST': for k in request.data dict[k] = request .data [k] return dict |
#2、處理數(shù)據(jù)
首先要判斷get或post過(guò)來(lái)的數(shù)據(jù)是否滿足我們的要求,例如缺少字段、類(lèi)型錯(cuò)誤等。
如果數(shù)據(jù)沒(méi)有問(wèn)題,再存入數(shù)據(jù)庫(kù)。
主要是對(duì)上面dict的處理,主要都是python語(yǔ)句實(shí)現(xiàn),不涉及Django,此處省略。
邏輯過(guò)程:
1、判斷傳入的request是否缺少相應(yīng)的字段
2、判斷傳入的request是否有類(lèi)型錯(cuò)誤
方法:
例如雇員表,add一行需要有以下信息,先定義一個(gè)list,用來(lái)和傳入數(shù)據(jù)作對(duì)比即可
emp = ["empno:int","ename:str","job:str","mgr:int","hiredate:str","sal:int",
"comm:int","deptno:int"]
如果
#3、返回結(jié)果
直接返回插入成功即可。
?
本文簡(jiǎn)單介紹基于Django api后臺(tái)接口開(kāi)發(fā)方法,新學(xué)Django,內(nèi)容僅供參考。
轉(zhuǎn)載于:https://www.cnblogs.com/dtstack/p/9668479.html
總結(jié)
以上是生活随笔為你收集整理的初识Django —Python API接口编程入门的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 2018091-2博客作业
- 下一篇: 使用python制作神经网络——搭建框架