大致了解我们要完成的项目之后, 我们要进行项目的开发. 我们并不是直接讲解 Django 框架, 而是通过项目驱动的方式, 一步步掌握 Django 框架的基本使用.
1 项目创建
我们的项目基于 Django 框架, 所以我们先创建一个 Django 项目. 创建项目之前, 我们首先搭建我们的项目运行环境:
1.1 搭建开发环境
在开发过程中,当需要使用 python 的包时可以通过 pip 命令联网安装, 所有第三方的包都会被pip安装到Python3的site-packages目录下。 如果我们要同时开发多个应用程序,那这些应用程序都会共用一个Python,就是安装在系统的Python3。如果应用A需要django 1.8.7,而应用B需要django 1.8.2. 这种情况下,每个应用可能需要各自拥有一套 "独立" 的 Python 运行环境。
virtualenv 工具可以用来为一个应用创建一套 "隔离" 的Python运行环境。
安装虚拟环境命令:
代码语言:javascript复制pip install virtualenv
pip install virtualenvwrapper
virtualenvwrapper 是 virtualenv 的扩展集合, 用于简化虚拟环境创建操作相关操作.
安装好该工具之后, 我们可以通过下面的命令来创建一个隔离的 Python 运行环境:
代码语言:javascript复制# 创建虚拟环境
mkvirtualenv 虚拟环境名称
# 切换虚拟环境
workon 虚拟环境名称
# 查看已创建的虚拟环境
workon 两次tab键
# 删除虚拟环境
rmvirtualenv 虚拟环境名称
# 退出虚拟环境
deactivate
创建成功虚拟环境之后,会自动切换到这个虚拟环境中, 如果需要切换到其他虚拟环境下或者删除当前虚拟环境, 那么需要先退出当前虚拟环境.
提示1:创建虚拟环境需要联网; 提示2:工作在虚拟环境上,提示符最前面会出现 "(虚拟环境名称)". 在虚拟环境中安装所需要的包(首先workon到虚拟环境中).
我们现在创建我们项目所需的虚拟环境, 名称为: "django-dev-py3", 创建命令如下:
代码语言:javascript复制mkvirtualenv django-dev-py3
如果你的电脑上安装了多个Python版本, 比如既有 Python 2.7, 也安装了 Python 3.5, 那么在创建虚拟环境时, 可指定使用的 Python 版本, 命令如下:
代码语言:javascript复制mkvirtualenv django-dev-py3 --python=[python3路径]
执行过程如图25-1所示:
图1
标记红色矩形部分为我执行的命令, 创建完虚拟环境之后, 已经自动切换到了该虚拟环境下工作.
我们项目所使用的包环境如下:
- Django 1.8.2
- PyMySQL 0.8.0
我们之所以选择 Django 1.8.2, 原因在于这是一个稳定性高、使用广、文档多的版本.
在线中文文档: http://python.usyiyi.cn/translate/django_182/index.html
我们的项目使用的数据库为 MySQL, 我们选择使用了 PyMySQL 包.
切换到 django-dev-py3 虚拟环境下, 执行包安装命令如下:
代码语言:javascript复制pip install django==1.8.2
pip install pymysql
1.2 创建项目
切换到 django-dev-py3 虚拟环境下, 执行 cd 命令, 切换到要保存项目的目录下, 我这里创建在桌面, 执行创建 django 项目的命令:
代码语言:javascript复制django-admin startproject ttsx
"ttsx" 为我们创建项目的名称.
项目创建过程如图25-2所示:
图2
此时我们已经创建好了 django 项目. 该项目的目录结构如图25-2所示, 各个模块文件介绍如下:
- manage.py 文件是项目运行的入口文件,执行项目配置文件路径;
- __init__.py 文件为空文件,指定当前目录可作为包使用;
- settings.py 文件整个项目的配置文件,例如配置应用、模板目录、静态文件目录等等;
- urls.py 文件是项目的URL配置文件,例如将用户请求的 url 对应到我们某个视图函数;
- wsgi.py 是项目与支持 WSGI 协议的 WEB 服务器对接的入口文件。
1.3 创建应用
Django 框架通过应用的方式来管理整个网站项目. 一个网站中包含多个子业务模块,比如用户模块,商品模块,新闻模块等等,我们可以将这些子模块称作一个应用。 通过项目页面展示的功能, 我们大致将项目分为两个应用.
- 和商品展示相关的应用, 该应用我们叫做 goods 应用.
- 和购物车相关的应用, 该应用我们叫做 cart 应用.
每一个应用中包含了该业务所有的操作. 我们通过下面命令来创建所需要的两个应用:
代码语言:javascript复制python manage.py startapp goods
python manage.py startapp cart
此时项目的目录结构如下:
图3
项目结构中多出了名字为 cart 和 goods 两个目录, 两个目录内所包含的文件是一模一样的, 每个新创建的应用目录结构和 cart、goods是一样的. 每个应用中模块文件的含义如下:
- __init__.py 是一个空文件,表示当前目录可以当做一个Python包来使用;
- tests.py 用于开发测试用例,在实际开发中,如果需要对模块进行测试,可在此文件中编写测试代码;
- views.py 在此编写视图相关代码;
- models.py 在此编写模型相关代码;
- migrations包,稍后讲解模型创建时讲解.
注意: 创建的应用在 settings.py 模块中进行配置, 才能够被项目识别.
打开 ttsx 包下的 settings.py 模块, 找到 INSTALLED_APPS 配置项:
代码语言:javascript复制INSTALLED_APPS = (
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
)
该配置项中配置的是已经安装的应用, 配置该项如下:
代码语言:javascript复制INSTALLED_APPS = (
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'goods',
'cart',
)
我们的项目以及应用就创建完毕了.
1.4 开发服务器
在开发阶段,为了能够快速预览到网站的效果,django提供了一个纯 Python 编写的轻量级 WEB 服务器,仅在开发阶段使用. 运行服务器命令如下:
代码语言:javascript复制python manage.py runserver ip:端口
我们一般可不指定ip和端口,直接运行:
代码语言:javascript复制python manage.py runserver
服务器成功启动后效果如下图25-4所示:
图4
在浏览器中输入网址 "127.0.0.1:8000", 或者按着ctrl键点击上图中标示出来的地址,可以查看当前站点开发效果. 如图25-5所示:
图25-5
如果增加、修改、删除文件,服务器会自动重启. 按 CTRL C 停止服务器.
2 模型创建
2.1 ORM 概述
当前项目的开发都是数据库驱动,即分析出项目中所需要存储的数据,然后设计数据表结构,接下来对通过编写 SQL 语句对数据库中的表进行 CURD 操作。
Django 提供了一套针对数据库操作的代码库, 通过该代码库中提供的工具, 我们可以创建查询、生成SQL语句,并且这些SQL无需开发人员自己处理。这样带来的好处是开发人员无需对 SQL 和 关系型数据库有深入的了解就能直接编写自己的查询。
我们把这套库称作 ORM 库, ORM 是对象关系映射, 对象表示的是我们Python中的对象概念, 关系指的是关系型数据库. 通过 ORM 完成 对象和 数据库中的表之前的一一对应关系. 对对象的任何操作就是对表的操作.
另外 ORM 强大的地方,ORM支持多种数据库后端。可非常简单帮助我们切换后端数据库。Django中提供了自己内置的 ORM 库。我们不需要面向数据库编程,而是通过定义模型类,通过对我们的模型类和对象的方法调用,从而完成了对数据库 CRUD 操作。
简言之, ORM 库帮我们封装了对关系型数据库的 CRUD 操作, 我们不需要编写一行 SQL, 即可完成对数据库的操作.
2.2 数据库配置
打开 ttsx/settings.py 文件, 在该配置文件中默认使用的是 SQLITE 数据库, 原 SQLITE 配置内容如下:
代码语言:javascript复制DATABASES = {
'default': {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
}
}
现配置项目数据库为 MYSQL:
代码语言:javascript复制DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql', # mysql数据库引擎
'NAME': 'my_ttsx', # 数据库名字
'USER': 'root', # 用户名
'PASSWORD': 'chuanzhi', # 密码
'HOST': 'localhost', # 主机
'PORT': '3306' # 端口
}
}
配置完成之后, 在 ttsx 目录下的 __init__.py 中增加如下代码:
代码语言:javascript复制import pymysql
pymysql.install_as_MySQLdb()
一定要保证配置文件中指定的数据库是存在的, 如果不存在需要创建对应数据库. 启动测试服务器, 如果没有报错, 那么表示配置成功.
查看上篇文章:https://cloud.tencent.com/developer/article/1860057