本文的实践都是在Windows平台下,请参考以下文章来安装Django。以下练习是基于我做的一个Report Server的简化版,我把最核心的操作都提炼出来,希望对大家有用。
练习题目:case是数据库中的一张表,有两列,分别为case name,case result。建立一个网站,可以在网页中显示出数据库中case的信息,还可以通过case name
http://www.jianshu.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"}]