深入浅出Django

Django简介

Django是一个高级的Python Web开发框架,它的目标是使得开发复杂的、数据库驱动的网站变得更加简单。

由于Django最初是被开发来用于管理劳伦斯出版集团旗下的一些以新闻内容为主的网站的。所以,我们可以发现在使用Django的很多网站里,都是用于作为CMS(内容管理系统)来使用的。使用Django的一些比较知名的网站如下图所示:

使用Django的网站

Django是一个MTV框架,其架构模板看上去与传统的MVC架构并没有太大的区别。其对比如下表所示:

传统的MVC架构 Django 架构
Model Model(Data Access Logic)
View Template(Presentation Logic)
View View(Business Logic)
Controller Django itself

在Django中View只用来描述你要看到的内容,Template才是最后用于显示的内容。而在MVC架构中,这只相当于是View层。它的核心包含下面的四部分:

  • 一个 对象关系映射,作为数据模型和关系性数据库间的媒介(Model层);
  • 一个基于正则表达式的URL分发器(即MVC中的Controller);
  • 一个用于处理HTTP请求的系统,含web模板系统(View层);

其核心框架还包含:

  • 一个轻量级的、独立的Web服务器,只用于开发和测试。
  • 一个表单序列化及验证系统,用于将HTML表单转换成适用于数据库存储的数据。
  • 一个缓存框架,并且可以从几种缓存方式中选择。
  • 中间件支持,能对请求处理的各个阶段进行处理。
  • 内置的分发系统允许应用程序中的组件采用预定义的信号进行相互间的通信。
  • 一个序列化系统,能够生成或读取采用XML或JSON表示的Django模型实例。
  • 一个用于扩展模板引擎的能力的系统。

Django应用架构

Django的每一个模块在内部都称之为APP,在每个APP里都有自己的三层结构。如下图所示:

Django 应用架构

这样做不仅可以在开发的时候更容易理解系统,而且可以提高代码的可复用性——因为每一个APP都是独立的应用,在下次使用时我们只需要简单的复制和粘贴。

说了这么多,还不如从一个hello,world开始。

Django hello,world

安装Django

安装Django之前,我们可以用virtualenv工具来创建一个虚拟的Python运行环境。环境问题是一个很复杂的问题,在我们使用Python的过程中,我们会不断地安装一些库,而这些库可能会有不同的版本。并且在安装Python库的过程中,我们会遇到权限问题——即我们需要超级用户的权限才能将库安装到系统的环境之下。随后在这个软件的生涯中,我们还需要保证这个项目所依赖的模块不会发生变动。而这些都是很棘手的一些事,这时候我们就需要创建一个虚拟的运行环境,而virtualenv就是这样的一个工具。

virtualenv

安装Python包我们需要用到pip命令,它是Python语言中的一个包管理工具。如果你没有安装的话,可以使用下面的命令来安装:

  1. curl https://bootstrap.pypa.io/get-pip.py | python

在不同的Python环境中,我们可能需要使用不同的pip,如下所示是笔者使用的Python3的pip命令pip3

  1. $ pip3 install virtualenv

如果是Python2.7的话,对应会有:

  1. $ pip install virtualenv

需要注意的是这将会安装到Python所在的目录,如我的目录是:

  1. $ /usr/local/bin/virtualenv

有的可能会是:

  1. $ /usr/local/share/python3/virtualenv

在创建我们的这个虚拟环境之前,我们可以创建一个存储所有virtualenv的目录:

  1. $ mkdir somewhere/virtualenvs

现在,我们就可以创建一个新的虚拟环境:

  1. $ virtualenv somewhere/virtualenvs/<project-name> --no-site-packages

如果你想使用不同的Python版本的话,那么需要指定Python版本的路径

  1. $ virtualenv --distribute -p /usr/local/bin/python3.3 somewhere/virtualenvs/<project-name>

通过到相应的目录下执行激活就可以使用这个虚拟环境了:

  1. $ cd somewhere/virtualenvs/<project-name>/bin
  2. $ source activate

停止使用只需要执行下面的命令即可:

  1. $ deactivate

安装Django

准备了这么久我们终于要开始安装Django了,执行:

  1. $ pip install django

开始下最新版本的Django,如下所示:

  1. Collecting django
  2. Downloading Django-1.9.4-py2.py3-none-any.whl (6.6MB)
  3. 94% |██████████████████████████████▎ | 6.2MB 251kB/s eta 0:00:02

等下载完后,就会开始安装Django。安装完后,我们就可以使用Django自带的django-admin命令。django-admin是Django自带的一个管理任务的命令行工具。

通过这个命令,我们不仅仅可以用它来创建项目、创建app、运行服务、数据库迁移,还可以执行各种SQL工具等等。django-admin用法如下:

  1. $ django-admin <command> [options]

下面是django-admin自带的一些命令:

  1. [django]
  2. check
  3. compilemessages
  4. createcachetable
  5. dbshell
  6. diffsettings
  7. dumpdata
  8. flush
  9. inspectdb
  10. loaddata
  11. makemessages
  12. makemigrations
  13. migrate
  14. runfcgi
  15. runserver
  16. shell
  17. sql
  18. sqlall
  19. sqlclear
  20. sqlcustom
  21. sqldropindexes
  22. sqlflush
  23. sqlindexes
  24. sqlinitialdata
  25. sqlmigrate
  26. sqlsequencereset
  27. squashmigrations
  28. startapp
  29. startproject
  30. syncdb
  31. test
  32. testserver
  33. validate

现在,让我们来看看这个强大的工具。

创建项目

在这些命令中startproject可以用于创建项目,在这里我们的项目名是blog,那么我们的命令如下:

$ django-admin startproject blog

这个命令将创建下面的文件内容,而这些是Django项目的一些必须文件。

  1. .
  2. ├── blog
  3. ├── __init__.py
  4. ├── settings.py
  5. ├── urls.py
  6. └── wsgi.py
  7. └── manage.py

blog目录对应的就是blog这个项目,将会放置这个项目的一些相关配置:

  1. settings.py包含了这个项目的相关配置。如数据库环境、启用的插件等等。
  2. urls.py即URL Dispatcher的配置,指明了某个URL应该指向某个函数来处理。
  3. wsgi.py用于部署。WSGI(Python Web Server Gateway Interface,Web服务器网关接口)是为Python语言定义的Web服务器和Web应用程序或框架之间的一种简单而通用的接口。
  4. __init__.py指明了这是一个Python模块。

manage.py 会在每个Django项目中自动生成,它可以和django-admin做类似的事。如我们可以用manage.py来启动测试环境的服务器:

$ python manage.py runserver

  1. Performing system checks...
  2. System check identified no issues (0 silenced).
  3. You have unapplied migrations; your app may not work properly until they are applied.
  4. Run 'python manage.py migrate' to apply them.
  5. March 24, 2016 - 03:07:34
  6. Django version 1.9.4, using settings 'blog.settings'
  7. Starting development server at http://127.0.0.1:8000/
  8. Quit the server with CONTROL-C.
  9. Not Found: /
  10. [24/Mar/2016 03:07:35] "GET / HTTP/1.1" 200 1767
  11. Not Found: /favicon.ico
  12. [24/Mar/2016 03:07:36] "GET /favicon.ico HTTP/1.1" 404 1934

现在,我们只需要在浏览器中打开http://127.0.0.1:8000/,便可以访问我们的应用程序。

Django后台

Django很适合CMS的另外一个原因,就是它自带了一个后台管理系统。为了启用这个后台管理系统,我们需要配置我们的数据库,并创建相应的超级用户。如下所示的是settings.py中的默认数据库配置:

  1. # Database
  2. # https://docs.djangoproject.com/en/1.7/ref/settings/#databases
  3. DATABASES = {
  4. 'default': {
  5. 'ENGINE': 'django.db.backends.sqlite3',
  6. 'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
  7. }
  8. }

上面的配置中我们使用的是SQLite3作为数据库,并使用了当前目录下的db.sqlite3作为数据库文件。Django内建支持下面的一些数据库:

  1. 'django.db.backends.postgresql_psycopg2'
  2. 'django.db.backends.mysql'
  3. 'django.db.backends.sqlite3'
  4. 'django.db.backends.oracle'

如果我们想使用别的数据库,可以在网上寻找相应的解决方案,如用于支持使用MongoDB的django-nonrel项目。不同的数据库有不同的配置,如下所示的是使用PostgreSQL的配置。

  1. DATABASES = {
  2. 'default': {
  3. 'ENGINE': 'django.db.backends.postgresql_psycopg2',
  4. 'NAME': 'mydatabase',
  5. 'USER': 'mydatabaseuser',
  6. 'PASSWORD': 'mypassword',
  7. 'HOST': '127.0.0.1',
  8. 'PORT': '5432',
  9. }
  10. }

接着,我们就可以运行数据库迁移,只需要运行相应的脚本即可:

$ python manage.py migrate

  1. Operations to perform:
  2. Apply all migrations: sessions, admin, auth, contenttypes
  3. Running migrations:
  4. Rendering model states... DONE
  5. Applying contenttypes.0001_initial... OK
  6. Applying auth.0001_initial... OK
  7. Applying admin.0001_initial... OK
  8. Applying admin.0002_logentry_remove_auto_add... OK
  9. Applying contenttypes.0002_remove_content_type_name... OK
  10. Applying auth.0002_alter_permission_name_max_length... OK
  11. Applying auth.0003_alter_user_email_max_length... OK
  12. Applying auth.0004_alter_user_username_opts... OK
  13. Applying auth.0005_alter_user_last_login_null... OK
  14. Applying auth.0006_require_contenttypes_0002... OK
  15. Applying auth.0007_alter_validators_add_error_messages... OK
  16. Applying sessions.0001_initial... OK
  17. (growth-django)

在上面的过程中,我们会创建相应的数据库模型,并依据迁移脚本来创建一些相应的数据,如默认的配置等等。

最后,我们可以创建一个相应的超级用户来登陆后台。

$ python manage.py createsuperuser

  1. Username (leave blank to use 'fdhuang'): root
  2. Email address: h@phodal.com
  3. Password:
  4. Password (again):
  5. Superuser created successfully.

输入相应的用户名和密码,即可完成创建。然后访问 http://127.0.0.1:8000/admin,输入上面的用户名和密码就可以来到后台:

Django后台

第一次提交

在创建完应用后,我们就可以进行第一次提交,通常初次提交的提交信息(commit message)是init project。如果在那之前,你没有执行git init来初始化git的话,那么我们就需要去执行这个命令。

  1. git init

它将返回类似于下面的结果

  1. Initialized empty Git repository in /Users/fdhuang/test/helloworld/.git/

即初始化了一个空的Git项目,然后我们就可以执行add来添加上面的内容:

  1. git add .

需要注意的是上面的数据库文件不应该添加到项目里,所以我们应该执行reset命令来重置这个状态:

  1. git reset db.sqlite3

这时我们会将其变成下面的状态:

第一次提交前的reset

上面的绿色文件代表这几个文件都被添加了进去,蓝色则代表未添加的文件。为了避免手误产生一些问题,我们需要添加一个名为.gitignore文件用于将一些文件名加入忽略名单,如下是常用的python项目的.gitignore文件中的内容:

  1. *.pyc
  2. *.db
  3. *.sqlite3

当我们添加完这个文件,git就会识别这个文件,并忽略原来的那些文件,如下图所示:

添加完gitignore文件后的效果

我们只需要添加这个文件即可:

  1. git add .gitignore

如果你之前已经不小心添加了一些不应该添加的文件,那么可以执行下面的命令来重置其状态:

  1. git reset .

然后再执行添加命令。

最后,我们就可以在本地提交我们的代码了:

  1. git commit -m "init project"

如果你是将代码托管在GitHub上的话,那么你就可以执行git push来将代码提交到服务器上。