如何架设服务器,如何回复http请求,如何创建App。这一回,我们要走入糖果庄园。
数据库是一所大庄园,藏着各种宝贝。一个没有数据库的网站,所能提供的功能会非常有限。
为了找到心爱的人,姜戈决定一探这神秘的糖果庄园。
Django为多种数据库后台提供了统一的调用API。根据需求不同,Django可以选择不同的数据库后台。MySQL算是最常用的数据库。我们这里将Django和MySQL连接。
在Linux终端下启动mysql:
1
|
$
mysql
-
u
root
-
p
|
在MySQL中创立Django项目的数据库:
1
|
mysql
>
CREATE
DATABASE
villa
DEFAULT
CHARSET
=
utf8
;
|
这里使用utf8作为默认字符集,以便支持中文。
在MySQL中为Django项目创立用户,并授予相关权限:
1
|
mysql
>
GRANT
SELECT
,
INSERT
,
UPDATE
,
DELETE
,
CREATE
,
DROP
,
INDEX
,
ALTER
,
CREATE
TEMPORARY
TABLES
,
LOCK
TABLES
ON
villa
.
*
TO
'vamei'
@
'localhost'
IDENTIFIED
BY
'vameiisgood'
;
|
在settings.py中,将DATABASES对象更改为:
1
2
3
4
5
6
7
8
9
10
|
DATABASES
=
{
'default'
:
{
'ENGINE'
:
'django.db.backends.mysql'
,
'NAME'
:
'villa'
,
'USER'
:
'vamei'
,
'PASSWORD'
:
'vameiisgood'
,
'HOST'
:
'localhost'
,
'PORT'
:
'3306'
,
}
}
|
后台类型为mysql。上面包含数据库名称和用户的信息,它们与MySQL中对应数据库和用户的设置相同。Django根据这一设置,与MySQL中相应的数据库和用户连接起来。此后,Django就可以在数据库中读写了。
姜戈略一迟疑,旋即走入了庄园的大门。
MySQL是关系型数据库。但在Django的帮助下,我们不用直接编写SQL语句。Django将关系型的表(table)转换成为一个类(class)。而每个记录(record)是该类下的一个对象(object)。我们可以使用基于对象的方法,来操纵关系型的MySQL数据库。
在传统的MySQL中,数据模型是表。在Django下,一个表为一个类。表的每一列是该类的一个属性。在models.py中,我们创建一个只有一列的表,即只有一个属性的类:
1
2
3
4
5
6
|
from
django
.
db
import
models
class
Character
(
models
.
Model
)
:
name
=
models
.
CharField
(
max_length
=
200
)
def
__unicode__
(
self
)
:
return
self
.
name
|
类Character定义了数据模型,它需要继承自models.Model。在MySQL中,这个类实际上是一个表。表只有一列,为name。可以看到,name属性是字符类型,最大长度为200。
类Character有一个__unicode__()方法,用来说明对象的字符表达方式。如果是Python 3,定义__str__()方法,实现相同的功能。
命令Django同步数据库。Django根据models.py中描述的数据模型,在MySQL中真正的创建各个关系表:
1
|
$
python
manage
.
py
syncdb
|
同步数据库后,Django将建立相关的MySQL表格,并要求你创建一个超级用户:
Creating tables …
Creating table django_admin_log
Creating table auth_permission
Creating table auth_group_permissions
Creating table auth_group
Creating table auth_user_groups
Creating table auth_user_user_permissions
Creating table auth_user
Creating table django_content_type
Creating table django_session
Creating table west_character
You just installed Django’s auth system, which means you don’t have any superusers defined.
Would you like to create one now? (yes/no): yes
Username (leave blank to use ‘tommy’): vamei
Email address: [email protected]
Password:
Password (again):
Superuser created successfully.
Installing custom SQL …
Installing indexes …
Installed 0 object(s) from 0 fixture(s)
数据模型建立了。打开MySQL命令行:
1
|
$
mysql
-
u
vamei
-
p
|
查看数据模型:
1
2
3
|
USE
villa
;
SHOW
TABLES
;
SHOW
COLUMNS
FROM
west_character
;
|
最后一个命令返回Character类的对应表格:
+——-+————–+——+—–+———+—————-+
| Field | Type | Null | Key | Default | Extra |
+——-+————–+——+—–+———+—————-+
| id | int(11) | NO | PRI | NULL | auto_increment |
| name | varchar(200) | NO | | NULL | |
+——-+————–+——+—–+———+—————-+
2 rows in set (0.00 sec)
可以看到,Django还自动增加了一个id列,作为记录的主键(Primary Key)。
这富丽堂皇的别墅中,姜戈隐隐闻到凶险的味道。
数据模型虽然建立了,但还没有数据输入。为了简便,我们手动添加记录。打开MySQL命令行,并切换到相应数据库。添加记录:
1
2
3
|
INSERT
INTO
west_character
(
name
)
Values
(
'Vamei'
)
;
INSERT
INTO
west_character
(
name
)
Values
(
'Django'
)
;
INSERT
INTO
west_character
(
name
)
Values
(
'John'
)
;
|
查看记录:
1
|
SELECT *
FROM
west_character
;
|
可以看到,三个名字已经录入数据库。
下面我们从数据库中取出数据,并返回给http请求。在west/views.py中,添加视图。对于对应的请求,我们将从数据库中读取所有的记录,然后返回给客户端:
1
2
3
4
5
6
7
8
9
10
|
# -*- coding: utf-8 -*-
from
django
.
http
import
HttpResponse
from
west
.
models
import
Character
def
staff
(
request
)
:
staff_list
=
Character
.
objects
.
all
(
)
staff_str
=
map
(
str
,
staff_list
)
return
HttpResponse
(
""
+
' '
.
join
(
staff_str
)
+
""
)
|
可以看到,我们从west.models中引入了Character类。通过操作该类,我们可以读取表格中的记录
为了让http请求能找到上面的程序,在west/urls.py增加url导航:
1
2
3
4
5
|
from
django
.
conf
.
urls
import
patterns
,
include
,
url
urlpatterns
=
patterns
(
''
,
url
(
r
'^staff/'
,
'west.views.staff'
)
,
)
|
运行服务器。在浏览器中输入URL:
127.0.0.1:8000/west/staff
查看效果:
从数据库读出数据,显示在页面
“我心爱的人,原来你在这里。” 姜戈强自镇定,嘴角忍不住颤动。
Django使用类和对象接口,来操纵底层的数据库。
有了数据库,就有了站点内容的大本营。
本文借鉴:http://python.jobbole.com/82786/