简介
今天我要开始一个关于Django基础知识的新系列教程。这是一个完整的初学者指南开始学习Django。材料分为七个部分。我们将详细探讨所有的基本概念,从安装、开发环境的准备、模型、视图、模板、url到更高级的主题,如迁移、测试和部署。
为了做一个容易遵循,信息丰富,阅读乐趣的教程,我想做些改变。于是我想出了一个主意,就是沿着文本创作一些漫画来说明一些概念和场景。希望你们会喜欢!
在我们开始之前…
当我在一所大学担任代课教授时,我曾在计算机科学课程中为新来的学生讲授web开发学科的介绍。我总是用孔子的这句话开始新的课程:实践出真知.
为什么要学习Django?
Django是一个用Python编写的Web框架。Web框架是一种支持动态网站、应用程序和服务开发的软件。它提供了一组工具和功能来解决与Web开发相关的许多常见问题,例如安全特性、数据库访问、会话、模板处理、URL路由、国际化、本地化等等。
使用诸如Django这样的Web框架,使我们能够以标准化的方式非常快速地开发安全可靠的Web应用程序,而不必重新设计轮子。
那么,Django有什么特别之处?对于初学者来说,它是一个python的web框架,这意味着您可以从广泛的开源库中获益。Python包索引存储库托管了超过116K个包(根据2017年9月6日)。如果你需要解决一个特定的问题,很可能有人已经为它实现了一个库。
Django是用Python编写的最流行的Web框架之一。它绝对是目前最全的,提供了一系列现成的功能,例如用于开发和测试的独立Web服务器、缓存、中间件系统、ORM、模板引擎、表单处理、与Python的单元测试工具的接口。Django还附带了一系列额外的功能,提供了内置的应用程序,如身份验证系统、带有自动生成的CRUD操作页面的管理界面、生成联合提要(RSS/Atom)、站点地图。甚至还有一个地理信息系统(GIS)框架构建在Django中。
Django的开发得到了Django软件基金会的支持,并得到了JetBrains和Instagram等公司的赞助。Django也已经存在了一段时间了。经过12年多的打磨,已经是一个成熟、可靠和安全的Web框架。
都有哪些大厂在使用Django?
你可以通过已知的在使用Django的大厂产品,去了解Django能够做些什么,有些什么功能。比如: Instagram, Disqus, Mozilla, Bitbucket, Last.fm, National Geographic.
如果还想了解更多的话,可以参考 Django Sites 数据库, 他们详细列举了超过5000家使用Django的网站。
顺便说一句,去年,在Django Under the Hood 2016大会上,Django核心开发者Carl Meyer和Instagram员工就Instagram如何大规模使用Django以及它如何支持他们的增长发表了演讲。这个有趣的谈话耗时一个小时,如果你有兴趣的话可以去听一听。
安装
我们需要做的第一件事是在我们的机器上安装一些程序,以便能够开始玩Django。基本设置包括安装Python、Virtualenv和Django。
你可以不使用虚拟环境,但强烈建议使用。特别是如果你刚刚开始,最好还是使用虚拟环境进行开发测试。
使用Django开发网站或Web项目时,必须安装外部库来支持开发是非常常见的。使用虚拟环境可以保证开发的每个项目都有其独立的环境,依赖关系不会冲突。它还允许您在本地机器项目中维护运行在不同Django版本上的项目。
而且使用虚拟环境非常简单。
安装 Python 3.6.2
我们要做的第一件事是安装最新的Python的Release版本(我写这篇教程的时候是python3.6.2)。如果有更新的版本,那就使用最新吧,接下来的步骤应该差不多。
最好的方式是通过Homebrew进行安装,如果你的电脑还未安装Homebrew,通过终端执行下面的命令进行安装:
/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
安装时间可能有点长,但它会自动帮你处理好。当看到下面的信息时,就代表安装完成了:
==> Installation successful!
==> Homebrew has enabled anonymous aggregate user behaviour analytics.
Read the analytics documentation (and how to opt-out) here:
https://docs.brew.sh/Analytics.html
==> Next steps:
- Run `brew help` to get started
- Further documentation:
https://docs.brew.sh
我们将使用python3,因为最重要的Python库已经被移植到python3上,而且下一个主要的Django版本(2.x)将不再支持python2,所以python3是最好的选择。在终端中执行下面的命令:
brew install python3
安装成功后尝试执行一下以下命令:
python3 --version
Python 3.6.2
很好,Python已经启动并运行了。下一步:虚拟环境!
安装 Virtualenv
下一步,我们将使用pip(一个管理和安装Python包的工具)来安装virtualenv。pip本身是python2.x版本的包管理工具,在python 3.x以上版本中,我们要使用pip3
来执行下面的命令:
sudo pip3 install virtualenv
到目前为止,我们执行的安装是全系统的。从现在起,我们安装的一切,包括Django本身,都将安装在虚拟环境中。
可以这样想:对于您启动的每个Django项目,您将首先为它创建一个虚拟环境。就像每个Django项目都有一个沙盒。在这个沙盒里你可以任意读写文件,安装软件包,卸载软件包而不会影响到沙盒外。
我喜欢在我的个人电脑上创建一个名为Development的文件夹。然后,我用它来组织我所有的项目和网站。如果你愿意的话可以按照下面的步骤创建目录,你也可以按照你自己的习惯管理项目文件。
通常,我首先在我的开发文件夹中创建一个项目名称的新文件夹。因为这将是我们的第一个项目,我们不需要选择一个花哨的名字或任何东西。现在,我们可以称之为myproject。
mkdir myproject
cd myproject
这个文件夹是一个更高级别的目录,它将存储与Django项目相关的所有文件和东西,包括它的虚拟环境。
因此,让我们从创建我们的第一个虚拟环境并安装Django开始。
在myproject文件夹中执行下面的命令:
virtualenv venv -p python3
我们的虚拟环境已经创建好了。注意在开始使用之前,需要我们主动激活虚拟环境:
source venv/bin/activate
当虚拟环境被激活后,你会看到(venv)这样的关键字:
让我们试着弄清楚这里发生了什么。我们创建了一个名为venv的特殊文件夹。它在这个文件夹中包含Python的副本。激活venv环境之后,当我们运行python命令时,它将使用存储在venv中的本地副本,而不是我们先前安装的另一个副本。
另一个重要的事情是确认pip程序也已经安装好了,当我们使用它来安装Python包(比如Django)时,将被安装在venv环境中。
如果需要退出venv环境,执行下面的命令即可:
deactivate
这里不需要执行devactive,我们继续在venv环境里安装Django.
安装 Django
在venv激活的情况下,直接执行下面的命令来安装Django:
pip install django
安装完成,我们可以开始使用Django啦!
创建一个新项目
执行下面的命令来创建新项目,项目名称自定义,我们这里用myproject:
django-admin startproject myproject
Django内置安装了命令行工具django-admin,我们可以直接使用
在我们运行上面的命令之后,它将为Django项目生成基本文件夹结构。
现在,我们的myproject目录如下所示:
myproject/ <-- 更高一级的文件夹
|-- myproject/ <-- django 项目文件夹
| |-- myproject/
| | |-- __init__.py
| | |-- settings.py
| | |-- urls.py
| | |-- wsgi.py
| +-- manage.py
+-- venv/ <-- 虚拟环境的文件夹
我们最初的项目结构由五个文件组成:
manage.py:使用django-admin工具的快捷方式。它用于运行与我们的项目相关的管理命令。我们将使用它来运行开发服务器、运行测试、创建迁移等等。
init.py:这个空文件告诉Python这个文件夹是一个Python包。
settings.py:此文件包含项目的所有配置。我们会一直引用这个文件!
urls.py:此文件负责映射项目中的路由和路径。例如,如果要在URL
/about/
中显示某些内容,则必须先将其映射到此处。wsgi.py:此文件是用于部署的简单网关接口,现在暂时还不会用到,后面部署时会涉及到。
Django可以非常简便地启动本地web服务器。它在开发过程中非常方便,因此我们不必安装任何其他东西来在本地运行项目。我们可以通过执行以下命令进行测试:
python manage.py runserver
现在我们先忽略迁移报错信息(这个稍后讨论)。在Web浏览器中打开以下URL:http://127.0.0.1:8000,您应该看到以下页面:
Django 应用(Apps)
在Django框架中,我们需要注意下面这两个重要的概念:
- app: 是一个Web应用程序。一个应用程序通常由一组模型(数据库表)、视图、模板、测试组成。
- project:是配置和应用程序的集合。一个项目可以由多个应用程序或单个应用程序组成。
需要注意的是,没有项目就不能运行Django应用程序。像blog这样的简单网站可以完全在一个应用程序中编写,例如可以命名为blog或weblog。
这是一种源代码的分类和管理方法。初学者在开始的时候判断什么是应用程序、如何组织代码并不是很容易。我们先跳过这个!首先让我们熟悉一下Django的API和基本原理。
好吧!为了说明这一点,让我们创建一个简单的Web论坛。要创建我们的第一个应用程序,请转到manage.py文件是并执行以下命令:
django-admin startapp boards
注意这一次我们使用的命令是startapp。它会为我们创建应用程序的目录,现在我们的目录结构应该是如下:
myproject/
|-- myproject/
| |-- boards/ <-- 新建的Django应用程序!
| | |-- migrations/
| | | +-- __init__.py
| | |-- __init__.py
| | |-- admin.py
| | |-- apps.py
| | |-- models.py
| | |-- tests.py
| | +-- views.py
| |-- myproject/
| | |-- __init__.py
| | |-- settings.py
| | |-- urls.py
| | |-- wsgi.py
| +-- manage.py
+-- venv/
我们先来看看每一个文件的作用:
- migrations/: 在这里,Django存储一些文件来跟踪您在models.py文件,以便保存数据库和models.py同步。
- admin.py: 这是一个名为Django Admin的内置Django应用程序的配置文件.
- apps.py: 这是应用程序本身的配置文件。
- models.py: 这里是我们定义Web应用程序实体的地方。模型由Django自动转换成数据库表
- tests.py: 此文件用于编写应用程序的单元测试。
- views.py: 这是我们处理Web应用程序的请求/响应周期的文件。
现在我们已经创建了我们的第一个应用程序,让我们配置我们的项目使用它。
打开settings.py,找到INSTALLED_APPS
这个变量:
settings.py
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
]
从上面可以看出,Django已经安装了6个内置应用程序。它们提供了大多数Web应用程序需要的常见功能,如身份验证、会话、静态文件管理(图像、javascripts、css等)等等。
我们将在接下来的教程中来探讨这些应用程序。但现在,我们先暂时忽略他们。创建我们的boards应用程序,并添加到INSTALLED_APPS
中:
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'boards',
]
这里使用的是上面的漫画插图中的正方形和圆形的设计,我们的boards应用程序是黄色的圆形,django.contrib.admin、django.contrib.auth等应用程序就是图中的红色圆形。
第一个页面 Hello, World!
让我们创建第一个页面view。我们将在下一篇教程中详细探讨它,现在让我们先尝试一下用Django创建一个新页面的效果。
打开boards应用程序目录下的views.py并添加如下代码:
views.py
from django.http import HttpResponse
def home(request):
return HttpResponse('Hello, World!')
views.py中的定义的是接收HttpRequest对象并返回HttpResponse对象的Python函数。必须记住的这个流程!让我们先定义一个home并返回一个消息Hello, World!。
接着我们需要告诉Django什么时候去响应这个视图函数。它是由urls.py来实现的,让我们打开这个目录下的urls.py文件:
<details>
<summary>原始版本</summary>
原始的urls.py
from django.conf.urls import url
from django.contrib import admin
from boards import views
urlpatterns = [
url(r'^$', views.home, name='home'),
url(r'^admin/', admin.site.urls),
]
</details>
修订版本的urls.py
from django.urls import re_path
from django.contrib import admin
from boards import views
urlpatterns = [
re_path(r'^$', views.home, name='home'),
re_path(r'^admin/', admin.site.urls),
]
注意上面我们添加了几行代码:首先从boards
中引入了views
,python中引入的写法是from boards import views
;然后我们在urlpatterns
中新增了一行re_path(r'^$', views.home, name='home')
。
我们先不讨论这几行代码的作用,这个将在后面的教程中详细探讨。
在这里,Django通过正则匹配去查询我们的home
页面,这里使用的正则是^$
,它匹配的是空字符串,对应的路径地址是:http://127.0.0.1:8000。如果需要将首页的URL改为http://127.0.0.1:8000/homepage/,那么正则匹配就应该改为re_path(r'^homepage/$', views.home, name='home')
。
让我们试试它的效果。
python manage.py runserver
在浏览器中我们输入http://127.0.0.1:8000
成功了,你创建了你的第一个页面。
小结
这是本系列教程的第一部分。在本教程中,我们学习了如何安装最新的Python版本以及如何设置开发环境。我们还介绍了虚拟环境,并开始了我们的第一个Django项目,并且已经创建了我们的初始应用程序。
为了让我们保持一致,我在GitHub上提供了源代码。项目的当前状态可以在发布标签v0.1-lw下找到。下面的链接将带您找到正确的位置:github地址
译者注:为了适配新版本的python3,对部分代码进行了修改,原文可以查看原文地址。