Django是Python下的一款网络服务器框架。Python下有许多款不同的框架。Django是重量级选手中最有代表性的一位。许多成功的网站和APP都基于Django。虽然Django之于Python,达不到Rail之于Ruby的一统江湖的地位,但Django无疑也是Python在网络应用方面的一位主将。使用Django,可以方便的实现一个功能全面、管理简便的网站或App后端。这里从实用的角度出发,介绍如何使用Django框架。
一、安装Django
启动计算机中的Python,尝试载入Django模块。如果可以成功载入,那么说明Django已经安装好:
import django
print(django.VERSION)
但是实验楼环境里Django还没有安装,可以在命令行,尝试使用pip安装:
sudo pip install -i http://mirrors.aliyuncs.com/pypi/simple django
或者使用easy_install:
sudo easy_install django
二、启动
在命令行使用下面的命令创建项目:
django-admin.py startproject mysite
在当前目录下,将生成mysite文件夹。其文件树结构如下:
mysite
├── manage.py
└── mysite
├── __init__.py
├── settings.py
├── urls.py
└── wsgi.py
1 directory, 5 files
进入mysite目录,启动服务器:
cd mysite
python manage.py runserver 8000
上面的8000为端口号。如果不说明,那么端口号默认为8000。
打开浏览器,访问http://127.0.0.1:8000,可以看到服务器已经在运行:
虽然有一个能跑的服务器,但什么内容都没有。
三、第一个网页
在http协议中可以看到,网络服务器是“请求-回应”的工作模式。客户向URL发送请求,服务器根据请求,开动后厨,并最终为客人上菜。Django采用的MVC结构,即点单、厨房、储藏室分离。
我们需要一个指挥员,将URL对应分配给某个对象处理,这需要在mysite/mysite下的urls.py设定。Python会根据该程序,将URL请求分给某个厨师。
mysite
├── manage.py
└── mysite
├── __init__.py
├── settings.py
├── urls.py
└── wsgi.py
1 directory, 5 files
将urls.py修改为:
from django.conf.urls import patterns, include, url
from django.contrib import admin
admin.autodiscover()
urlpatterns = patterns('',
# Examples:
# url(r'^$', 'mysite.views.home', name='home'),
# url(r'^blog/', include('blog.urls')),
url(r'^admin/', include(admin.site.urls)),
url(r'^$', 'mysite.views.first_page'),
)
我们添加了最后一行。它将根目录的URL分配给一个对象进行处理,这个对象是mysite.views.first_page。
用以处理HTTP请求的这一对象还不存在,我们在mysite/mysite下创建views.py,并在其中定义first_page函数:
# -*- coding: utf-8 -*-
from django.http import HttpResponse
def first_page(request):
return HttpResponse("<p>世界好</p>")
第一行说明字符编码为utf-8,为下面使用中文做准备。first_page函数的功能,是返回http回复,即这里的<p>世界好</p>。first_page有一个参数request,该参数包含有请求的具体信息,比如请求的类型等,这里并没有用到。
页面效果如下:
四、增加APP
一个网站可能有多个功能。我们可以在Django下,以app为单位,模块化的管理,而不是将所有的东西都丢到一个文件夹中。在mysite目录下,运行manange.py,创建新的app:
$python manage.py startapp west
这个新的app叫做west,用来处理西餐。
我们的根目录下,出现了一个新的叫做west的文件夹。
mysite/
├── manage.py
├── mysite
│ ├── __init__.py
│ ├── __init__.pyc
│ ├── settings.py
│ ├── settings.pyc
│ ├── urls.py
│ ├── views.py
│ └── wsgi.py
└── west
├── admin.py
├── __init__.py
├── models.py
├── tests.py
└── views.py
我们还需要修改项目设置,说明我们要使用west。在mysite/mysite/settings.py中,在INSTALLED_APPS中,增加"west":
INSTALLED_APPS = (
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'west',
)
可以看到,除了新增加的west,Django已经默认加载了一些功能性的app,比如用户验证、会话管理、显示静态文件等。我们将在以后讲解它们的用途。
五、增加APP页面
我们下面为APP增加首页。我们之前是在mysite/urls.py中设置的URL访问对象。依然采用类似的方式设置。
另一方面,为了去耦合,实现模块化,我们应该在west/urls.py中设置URL访问对象。具体如下:
首先,修改mysite/urls.py:
from django.conf.urls import patterns, include, url
from django.contrib import admin
admin.autodiscover()
urlpatterns = patterns('',
# Examples:
# url(r'^$', 'mysite.views.home', name='home'),
# url(r'^blog/', include('blog.urls')),
url(r'^admin/', include(admin.site.urls)),
url(r'^$', 'mysite.views.first_page'),
url(r'^west/', include('west.urls')),
)
注意新增加的最后一行。这里,我们提醒指挥员,对于west/的访问,要参考west/urls.py。
随后,我们创建west/urls.py,添加内容:
from django.conf.urls import patterns, include, url
urlpatterns = patterns('',
url(r'^$', 'west.views.first_page'),
)
将URL对应west下,views.py中的first_page函数。
最后,在west下,修改views.py为:
# -*- coding: utf-8 -*-
from django.http import HttpResponse
def first_page(request):
return HttpResponse("<p>西餐</p>")
访问http://127.0.0.1:8000/west,查看效果。
可以看到,Django的创建过程非常简单。但这只是初次尝试Django。为了创建一个完整功能的网站,还需要调用Django许多其它的功能。
六、连接数据库
Django为多种数据库后台提供了统一的调用API。根据需求不同,Django可以选择不同的数据库后台。MySQL算是最常用的数据库。我们这里将Django和MySQL连接。
安装MYSQLdb:
sudo apt-get install python-mysqldb
在Linux终端下启动mysql:
sudo service mysql start
mysql -u root
在MySQL中创立Django项目的数据库:
mysql> CREATE DATABASE villa DEFAULT CHARSET=utf8;
这里使用utf8作为默认字符集,以便支持中文。
在MySQL中创立用户,并授予相关权限:
mysql> GRANT SELECT, INSERT, UPDATE, DELETE, CREATE, DROP, INDEX, ALTER, CREATE TEMPORARY TABLES, LOCK TABLES ON villa.* TO 'vamei'@'localhost' IDENTIFIED BY 'shiyanlou';
在settings.py中,将DATABASES对象更改为:
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'villa',
'USER': 'root',
'HOST':'localhost',
'PORT':'3306',
}
}
后台类型为mysql。上面包含数据库名称和用户的信息,它们与MySQL中对应数据库和用户的设置相同。Django根据这一设置,与MySQL中相应的数据库和用户连接起来。此后,Django就可以在数据库中读写了。
七、创立模型
MySQL是关系型数据库。但在Django的帮助下,我们不用直接编写SQL语句。Django将关系型的表(table)转换成为一个类(class)。而每个记录(record)是该类下的一个对象(object)。我们可以使用基于对象的方法,来操纵关系型的MySQL数据库。
在传统的MySQL中,数据模型是表。在Django下,一个表为一个类。表的每一列是该类的一个属性。在models.py中,我们创建一个只有一列的表,即只有一个属性的类:
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根据west/models.py中描述的数据模型,在MySQL中真正的创建各个关系表:
python manage.py syncdb
python manage.py makemigrations west
python manage.py migrate
同步数据库后,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'): root
Email address: xxxxx@xmail.com
Password:
Password (again):
Superuser created successfully.
Installing custom SQL ...
Installing indexes ...
Installed 0 object(s) from 0 fixture(s)
数据模型建立了。打开MySQL命令行(提示输入密码:shiyanlou):
$mysql -u root
查看数据模型:
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命令行,并切换到相应数据库。添加记录:
INSERT INTO west_character (name) Values ('Vamei');
INSERT INTO west_character (name) Values ('Django');
INSERT INTO west_character (name) Values ('John');
查看记录:
SELECT * FROM west_character;
可以看到,三个名字已经录入数据库。
下面我们从数据库中取出数据,并返回给http请求。在west/views.py中,添加视图。对于对应的请求,我们将从数据库中读取所有的记录,然后返回给客户端:
# -*- 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("<p>" + ' '.join(staff_str) + "</p>")
可以看到,我们从west.models中引入了Character类。通过操作该类,我们可以读取表格中的记录。
为了让http请求能找到上面的程序,在west/urls.py增加url导航:
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使用类和对象接口,来操纵底层的数据库。有了数据库,就有了站点内容的大本营。