初識Django —Python API接口編程入門
來自: http://yq.aliyun.com/articles/5842
初識 Django
— Python API 接口編程入門
一、WEB架構的簡單介紹
Django是什么?
Django是一個開放源代碼的Web應用框架,由Python寫成。我們的目標是用Python語言,基于Django框架,利用MVC模型,實現后臺方面的針對數據庫的API開發。先了解一下互聯網的WEB架構,
如上圖:
互聯網的WEB架構大致分為三層,web層、app層和數據庫層。Web層:如apache網站服務器;app層主要是應用業務;DB指后臺數據庫。隨著互聯網的高速發展,網站訪問量的增長、數據的累積、負載的過高,應用和數據庫的設計也面臨了更多的挑戰。業務的拆分、數據庫的切分已不是什么新名詞。為了方便日后系統的平滑擴展,我們在系統設計的時候就需要規劃好APP業務實現模式。在這里,我們設計的APP也分為前臺和后臺,前臺主要是展現,如界面、FORM等,后臺為API接口,用來聯系前臺界面和數據庫的交互,本文只涉及到APP設計中的后臺API接口設計和用Python實現的部分。
當然一個項目的開發離不開團隊的合作,我們用GitLab來做開發代碼的版本管理,關于git的安裝和使用本文不以說明。
二、開發環境搭建
1、安裝Python2.8
2、安裝Django模塊
3、Python開發編輯器PyCharm
有了以上環境,我們就可以開工了,數據庫可以直接用Sqlite,如果用mysql的話要安裝mysqldb模塊。
三、模塊設計要求
新人報道,先到項目組領個接口開發任務吧。
項目組分配任務:完成XX數據模型的接口設計
涉及到的表有:XX_TAB
涉及到的API接口有:
1、list,獲取XX_TAB表數據,傳入參數XX_ID,從數據庫中列出XX_ID相同的行。
2、add,刪除XX_TAB表一行數據,傳入PK_ID、XX_ID
3、update,更新XX_TAB表一行數據,傳入PK_ID、XX_ID
4、delete,刪除XX_TAB表一行數據,傳入PK_ID、XX_ID
說白了就是在應用層實現對XX_TAB標的查詢和增刪改操作,以用于前臺APP的調用,前臺APP不直接針對數據庫做任何操作,由調用API接口來實現對數據庫的查詢、增刪改。這樣設計的目的是降低業務模塊間的耦合性,提高APP和數據庫的靈活性,便于以后業務的升級變更,也是考慮到今后數據庫數據量的增長而便于數據庫的拆分和平滑擴展。
四、實際開發
1、Django基本格式介紹
前面已經說過,我們是團隊開發的,先將同學們在git上已寫得代碼pull下來,第一次下載代碼,我是用git clone的命令復制到本地的,如下:
git clone http://git.xxx.cn/xxxtest/xxx.git
cd xxxtest #cd到項目目錄下
python manage.py runserver 127.0.0.1:8000 #啟動項目
注意:我是用git下載的代碼,不是自己新建的project。如果同學們是新建項目的話,還需按部就班從 django-admin.py startproject [project_name] 開始。
創建完項目后,Django框架會自動生成一些文件和文件夾,注意settings.py文件,關于數據庫設置處,默認如下代碼:
= {
'default': {
'ENGINE' : 'django.db.backends.sqlite3',
'NAME' : os.path.join(BASE_DIR, 'db.sqlite3'),
}
}
</div>
在命令行下運行python manage.py runserver命令后,在項目文件下會自動生成一個 db.sqlite3 數據文件,Django默認數據庫為sqlite,可改成MySQL、Oracle、PG等,具體設置如MySQL如下:
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'test',
'USER': 'test',
'PASSWORD': 'test123',
'HOST':'localhost',
'PORT':'3306',
}
}
了解了數據庫的配置,我們還需要了解一下項目目錄下的主要幾個文件:
PROJECT_NAME: 項目的容器。
manage.py: 一個實用的命令行工具,可讓你以各種方式與該 Django 項目進行交互。
[PROJECT_NAME]/__init__.py: 一個空文件,告訴 Python 該目錄是一個 Python 包。
[PROJECT_NAME]/settings.py: 該 Django 項目的設置/配置。
[PROJECT_NAME]/urls.py: 該 Django 項目的 URL 聲明; 一份由 Django 驅動的網站"目錄"。
[PROJECT_NAME]/wsgi.py: 一個 WSGI 兼容的 Web 服務器的入口,以便運行你的項目。
上面是每個項目的通用介紹,回到實際的開發中來。
2、新建app和表定義
我們現在已經有了項目,我要做的是某個表的api接口,于是我在項目下新建了一個app,新建app用以下命令:
django-admin startapp xx_tab
這樣我們就新建了一個xx_tab命名的app,我們要做一些修改:
1、還是打開settings.py文件,找到INSTALLED_APPS參數,在最后面加入xx_tab的app名,如下:
INSTALLED_APPS = [
<b><span style="font-size:9pt;">'django.contrib.admin'</span></b><span style="font-size:9pt;">,
<b><span style="font-size:9pt;">'django.contrib.auth'</span></b><span style="font-size:9pt;">,
<b><span style="font-size:9pt;">'django.contrib.contenttypes'</span></b><span style="font-size:9pt;">,
<b><span style="font-size:9pt;">'django.contrib.sessions'</span></b><span style="font-size:9pt;">,
<b><span style="font-size:9pt;">'django.contrib.messages'</span></b><span style="font-size:9pt;">,
<b><span style="font-size:9pt;">'django.contrib.staticfiles'</span></b><span style="font-size:9pt;">,
<b><span style="font-size:9pt;">'rest_framework_swagger'</span></b><span style="font-size:9pt;">,
<b><span style="font-size:9pt;">'rest_framework'</span></b><span style="font-size:9pt;">,
<b><span style="font-size:9pt;">'rest_framework_jwt'</span></b><span style="font-size:9pt;">,
<b><span style="font-size:9pt;">'xx_tab’</span></b><b><span style="font-size:9pt;">,</span></b><span style="font-size:9pt;"> ]</span></span></span></span></span></span></span></span></span></span></span></pre>
</div>
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
完成數據庫表的定義后,考慮到使用http來訪問數據庫的,那就離不開http的url地址。前面在文件介紹中說過用django-admin.py startproject [project_name]命令生成項目后,在項目層目錄下會有url的python文件,在每個項目下用django-admin startapp xx_tab命令生成的app中也會有url的python文件,url好比是網站網頁的目錄,是用來在web界面上訪問的地址。一般,url會對于view,view好比是網頁,url指向view。
項目rul、app rul和app view之間的調用關系,如下圖:
Project rul格式:
# 幾個測試接口
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調用舉例:
url在瀏覽器中的完整寫法應該如下:
http://127.0.0.1/xx_tab/list/?xx_id=1
4、用Django生成數據庫中的表
完成了在Django框架models.py文件中定義了xx_tab表的相關信息,我們就可以用django命令來生成表。
python manage.py makemigrations xx_tab
注意:xx_tab是app名,此命令會在xx_tab app下migrations目錄下生成一個0001_initial.py文件,此文件定義了建表信息,如果發現表定義有問題,在修改models.py中的定義后,需要刪除0001_initial.py文件,重跑python manage.py makemigrations xx_tab,重新生成0001_initial.py。
執行python manage.py migrate xx_tab,在數據庫中生成xx_tab表。
打開Sqlite數據庫,在windows下可用
d:\dt\sqlite\sqlite3.exe db.sqlite3 打開當前的數據庫,sqlite3.exe可在網上下載。
.table可查看當前的表。
.schema tab_name 可查看表結構定義。
5、API接口,實現ADD單行數據
我們要模擬從前臺發出一個get或post請求,調用要寫的api接口實現插入數據庫的功能,
如下界面,模擬前臺調用
上面是一個插入演示頁面,post相關表字段值,完成對數據庫的一行數據插入。
完成這已插入過程的邏輯關系如下:
View.py主要是接收前臺post過來的數據,并在完成處理、存儲后返回相關信息。
Service.py主要處理數據,格式化數據
數據庫接口層主要處理對數據庫的數據存儲和訪問。
view.py
開頭,以下這幾行是必不可少的
# -*- coding: utf-8 -*-
from rest_framework import statusfrom rest_framework.decorators import api_viewfrom rest_framework.response import Response
因為在urls.py中我們定義的是 url( r'add/$' , views.add_xx_tab)
add指向 views.add_xx_tab
所以我們在views中需要定義add_xx_tab函數
@api_view(['POST', 'GET'])def xx_tab_add(request, *args):
#1、接收request數據
#2、處理數據
3、返回結果</span></span></pre>
基于 django rest_framework ,在處理 client http request 時需要用到 @ api_view 修飾。
同時,我們也需要弄清楚對于從 client 端 GET 或 POST 過來的數據我們怎么處理。
#1、接收request數據
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、處理數據
首先要判斷get或post過來的數據是否滿足我們的要求,例如缺少字段、類型錯誤等。
如果數據沒有問題,再存入數據庫。
主要是對上面dict的處理,主要都是python語句實現,不涉及Django,此處省略。
邏輯過程:
1、判斷傳入的request是否缺少相應的字段
2、判斷傳入的request是否有類型錯誤
方法:
例如雇員表,add一行需要有以下信息,先定義一個list,用來和傳入數據作對比即可
emp = ["empno:int","ename:str","job:str","mgr:int","hiredate:str","sal:int",
"comm:int","deptno:int"]
如果
#3、返回結果
直接返回插入成功即可。
本文簡單介紹基于Django api后臺接口開發方法,新學Django,內容僅供參考。
</div>