本文的實踐都是在Windows平臺下,請參考以下文章來安裝Django。以下練習是基于我做的一個Report Server的簡化版,我把最核心的操作都提煉出來,希望對大家有用。
練習題目:case是數據庫中的一張表,有兩列,分別為case name,case result。建立一個網站,可以在網頁中顯示出數據庫中case的信息,還可以通過case name
http://www.lxweimin.com/p/c6dfc12fa72e
練習小提示:
- 所有帶有python manage.py XXX 的命令都得在新建工程的第一級目錄下執行,也就是你運行這個命令必須該目錄下有manage.py。下面的練習中如果運行這些命令有問題,請查看路徑。
一 新建一個 django project
在Windows cmd中運行下面的命令,建立一個名叫mysite的project。
cd C:\
django-admin startproject mysite
可以看mysite的目錄如下,都是默認生成的文件。這里,主目錄是mysite,下一級還有一個mysite。在下面的操作中,要注意是在第一級還是第二季的mysite中,這里容易出錯。
二 新建 app
cd C:\mysite
python manage.py startapp case
一般一個項目有多個app, 當然通用的app也可以在多個項目中使用。本文的練習中只需要用到一個app。
三 將app添加到setting.py
將我們新建的應用case添加到 settings.py 中的 INSTALLED_APPS中,也就是告訴Django有這么一個應用。
如下所示,加入'case', 到INSTALLED_APPS.
# Application definition
INSTALLED_APPS = (
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'case',
)
四 數據庫建模
Django 模型是與數據庫相關的,與數據庫相關的代碼一般寫在 models.py 中,Django 支持 sqlite3, MySQL, PostgreSQL等數據庫,只需要在settings.py中配置即可,不用更改models.py中的代碼,豐富的API極大的方便了使用。
如下代碼所示,建立了一個class為case,有兩個成員屬性是name和result。這個類在數據庫中就對應了一張表。
from django.db import models
# Create your models here.
# below code is related to my example
class case(models.Model):
name = models.CharField(max_length=10)
result = models.CharField(max_length=10)
def __str__(self):
return '%s %s' % (self.name, self.result)
class Meta:
db_table = 'case'
五 Django數據庫配置(Optional)
本文的數據庫使用默認的數據庫 SQLite3,無需配置。如果你需要用MySQL,可以修改setting.py 的配置如下
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'mostest',
'USER':'root',
'PASSWORD':'cisco123',
'HOST':'10.74.31.149',
'PORT':'3306',
}
六 Django 在數據庫中生成表
這里我們進行3個步驟在默認的SQLite3中生成第四步中定義的數據表。
- python manage.py makemigrations
- python manage.py sqlmigrate case 0001
這一步是查看SQL的語句,運行該命令就可以顯示出來。不懂SQL語句沒關系,Django會為你生成命令。 - python manage.py migrate
這一步是真正在SQLite3中建立表case。當你在models.py中新增了類時,運行它就可以自動在數據庫中創建表了,不用手動創建。
下面的代碼是我在mac運行以上3步的copy,可做參考。
YATYANG-M-T02B:mysite yatyang$ python manage.py makemigrations
Migrations for 'case':
0001_initial.py:
- Create model case
YATYANG-M-T02B:mysite yatyang$ python manage.py sqlmigrate case 0001
BEGIN;
CREATE TABLE "case" ("id" integer NOT NULL PRIMARY KEY AUTOINCREMENT, "name" varchar(10) NOT NULL, "result" varchar(10) NOT NULL);
COMMIT;
YATYANG-M-T02B:mysite yatyang$ python manage.py migrate
Operations to perform:
Synchronize unmigrated apps: staticfiles, messages
Apply all migrations: admin, case, contenttypes, auth, sessions
Synchronizing apps without migrations:
Creating tables...
Running deferred SQL...
Installing custom SQL...
Running migrations:
Rendering model states... DONE
Applying contenttypes.0001_initial... OK
Applying auth.0001_initial... OK
Applying admin.0001_initial... 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 case.0001_initial... OK
Applying sessions.0001_initial... OK
下圖是在Windows中運行以上三條命令的截圖。
七 Django shell操作數據庫表
Django shell提供了豐富的API, 下面演示如何使用它。
python manage.py shell
Django 會自動進入在settings.py中設置的數據庫,如果是 MySQL 或 postgreSQL,會要求輸入數據庫用戶密碼。
在這個終端可以執行ORM的命令對數據庫進行操作?;蛘咧苯舆\行數據庫的SQL語句這個不在本文的練習范圍內。
- 在shell終端導入case類
from case.models import case
- 查看數據庫中case表的數據,此時數據庫中的case表為空。
case.objects.all()
- 在case中添加一條數據。
c = case(name='live1',result='PASS')
c.save()
- 查看case表中的數據以及數據結構等。
all_case = case.objects.all()
print all_case
print all_case[0]
print type(all_case)
search_case = case.objects.filter(name='live1')
八 Django 定義view函數:HTTP GET Request實例
Django中網址是寫在 urls.py 文件中,用正則表達式對應 views.py 中的一個函數。我們先來定義我們的view函數。
view函數中的返回都用json這種格式。
在view.py中我們會定義兩個函數,一個是HTTP GET函數,根據已有的case的name去數據庫中查詢,并返回相應的結果。
request.GET.get是獲取http url中的query string,就是客服端要傳給服務器的參數,比如本例中就是我需要查詢case的name是live1,就把live1傳給服務器。
from django.http import HttpResponse
import json
from .models import case
def get_case(request):
name1 = request.GET.get('name')
cases = case.objects.filter(name=name1)
data = []
for c in cases:
data.append({'name':c.name, 'result':c.result})
return HttpResponse(json.dumps(data), content_type="application/json")
九 Django定義URL.py
在case文件夾內,創建一個新的urls.py文件,輸入以下代碼。
這里有url的正則表達式匹配,我們用最簡單的方式,名字全匹配。如果url里面帶有get_case名字的就去找view.py中的get_case函數。
from django.conf.urls import url
from . import views
urlpatterns = [
url(r'get_case', views.get_case, name='get_case'),
]
我們打開 mysite/mysite/urls.py 這個文件, 添加了最后一行代碼。這個是讓Django的主urls.py去識別case app中的子urls.py文件。意思是只要url中帶有case關鍵字,就去找case app中的子urls.py文件中查看url匹配策略。
from django.conf.urls import include, url
from django.contrib import admin
urlpatterns = [
url(r'^admin/', include(admin.site.urls)),
#new added by yating
url(r'^case/', include('case.urls')),
]
小提示,在case app中,創建一個新的urls.py文件如果文件名寫成url.py,看看第十步啟動出什么錯誤啊。
十 啟動Django自帶的websever
啟動Django自帶的webserver命令如下,由下圖所以我的windows平臺一開始用8080端口出錯,可能是8080被占用了(有可能是我安裝的Fiddler占用了8080)。所以換一個端口就啟動成功了。
python manage.py runserver 0.0.0.0:8088
十一 驗證HTTP GET接口
打開瀏覽器,輸入以下命令
http://127.0.0.1:8088/case/get_case?name=live1
返回結果應該如下:
[{"name": "live1", "result": "PASS"}]