写在前面
该系列为读者首次翻译Django相关技术文档,主要作为学习查阅之用,如有错误,请指正,还望海涵!
getting started
第一次使用Django?第一次进行web开发?你来到了正确的地方!立刻开始阅读这一章节并开始运行吧!
Django概述
Django是在快节奏的新闻编辑室环境下所开发的,旨在快速便捷地进行web开发,本文档的目的是通过一些技术细节去了解Django是如何工作的,让我们立即开始吧!
编写您的第一个Django app,part 1
让我们通过示例进行学习。
通过本示例的学习,我们将引导你完成一个基本的民意调查应用app的创建工作,它将包括以下两部分。
- 一个可以查看民意并且进行投票的公共站点
- 一个允许您添加、改变、删除民意的管理站点
我们必须向您再次确认Django installed已经完成。您可以通过以下命令来确认Django是否安装以及版本。
python -m django --version
如果Django已经安装,那么您将可以看到版本信息,如果未安装,将会发生错误"No module named django"。
本次教程撰写是基于Django3.1,支持python3.6及更高版本,如果Django版本不符合,您可以查看对应版本的Django教程,或者更新Django到最新版本。如果您仍在使用较老版本的python,请确认使用相适应的Django版本。
Django version | Python versions |
---|---|
1.11 | 2.7,3.4,3.5,3.6,3.7(added in 1.11.17) |
2.0 | 3.4,3.5,3.6,3.7 |
2.1 | 3.5,3.6,3.7 |
2.2 | 3.5,3.6,3.7,3.8(added in 2.2.8),3.9(added in 2.2.17) |
3.0 | 3.6,3.7,3.8,3.9(added in 3.0.11) |
3.1 | 3.6,3.7,3.8,3.9(added in 3.1.3) |
创建项目
如果这是您第一次使用Django,您将必须进行一些初始化操作,也就是说您需要自动生成一些代码来搭建Django工程,包括数据库的配置,Django选项配置以及应用程序配置。
打开命令行工具,cd
到您希望存储代码的文件夹下,输入以下命令并运行
django-admin startproject mysite #创建项目mysite
这将在当前文件夹下创建一个mysite文件夹。
注意:请避免使用python内置关键词以及django常用词!
代码应该放在何处?
如果您的后端采用老版的PHP(不使用任何现代框架),您很有可能将代码放置于web服务器文件夹路径下(比如 /var/www)。在Django框架内并不这样做。因为这样做会产生一些风险,其他人可能通过网络查看您的代码,不利于安全。
startproject
命令创建文件夹如下
mysite/
manage.py
mysite/
__init__.py
settings.py
urls.py
asgi.py
wsgi.py
这些文件作用如下:
- 外部的mysite文件夹是整个项目的容器,它的命名不影响Django的运行,因此您凭借喜好任意修改它
manage.py
:一个命令行实用程序,可以让您通过各种方式与此Django项目进行交互。- 内部的mysite文件夹是一个该项目需要使用的Python扩展包,在您需要引入文件夹内的任何文件时需要使用到它的命名(比如
mysite.urls
)。 mysite/__init__.py
:空文件,旨在告诉python解释器,该文件夹应被解释为一个python扩展包。mysite/setting.py
:此Django项目的配置文件。mysite/urls.py
:此Django项目的Urls路径文件,用于定义url。mysite/asgi.py
:为您的Django项目提供兼容ASGI的服务器的入口。mysite/wsgi.py
:为您的Django项目提供兼容WSGI的服务器的入口。
开发服务器
确认您的Django项目可以正常运行。cd
到mysite
文件夹内并运行以下命令
python manage.py runserver
您将看到在命令行内看到以下输出
Performing system checks...
System check identified no issues (0 silenced).
You have unapplied migrations; your app may not work properly until they are applied.
Run 'python manage.py migrate' to apply them.
January 22, 2021 - 15:50:53
Django version 3.1, using settings 'mysite.settings' Starting development server at http://127.0.0.1:8000/ Quit the server with CONTROL-C.
通过这一行命令,一个纯粹由python编写的Django开发服务器开始运行,之所以包含这样一个功能是为了使得开发更加迅速,因为不需要进行服务器的配置,比如Apache服务器——直到您准备好将项目运用到实际产品中。
注意:请不要将本开发服务器运行到实际运营产品中,(我们在web框架领域是专业的!而非在服务器领域!)
现在服务器已经开始运行,通过web浏览器访问http://127.0.0.1:8000/
,您将会看到一个"Congratulations"界面,服务器正常运行!
改变端口
runserver
命令默认在8000端口运行开发服务器。
如果您想改变端口,加入一个命令行参数即可,示例如下,服务器运行在8080端口
python manage.py runserver 8080
如果您想改变服务器IP地址,将IP地址与端口一同传递到参数中即可,示例如下,可以监听所有能访问到该IP地址的web请求。
python manage.py runserver 0:8000
其中0是0.0.0.0的简写形式。
自动重载服务器
开发服务器将会根据需要对于每一次web请求重新加载python代码。也就是说当您更改代码后无需重启服务器。然而有一些操作比如添加文件并不会引起服务器重载,因此需要在完成更改操作后重启服务器。
创建民意调查app
现在项目环境已经准备就绪!
您在Django中编写的每个应用程序都包含一个遵循特定约定的Python包。Django附带了一个实用程序,该实用程序会自动生成应用程序的基本目录结构,因此您可以专注于编写代码而不是创建目录。
projects 与 apps
projects与apps之间有什么不同?app是一个可以实现一定功能的网络应用程序——比如网络博客系统、公共记录数据库或者一个小型的民意调查app。而project是针对一个特定网站的一系列app及其配置的集合,一个project可以包含多个apps,一个app可以存在于多个projects。
您的apps可以存在于python路径下任何地方。在本例教程中,我们创建的poll app与manage.py
处于同一目录,可作为顶层模块直接引入。
请确认manage.py
处于当前目录,并运行以下命令
python manage.py startapp polls
该命令将会创建一个名为polls
的文件夹,结构如下
polls/
__init__.py
admin.py
apps.py
migrations/
__init__.py
models.py
tests.py
views.py
编写您的第一个view文件
现在开始编写第一个view文件。打开文件polls/views.py
并且写入以下python代码。
from django.http import HttpResponse
def index(request):
return HttpResponse("Hello, world. You're at the polls index.")
这是一个最简单的视图函数,为了调用该函数,我们需要将其映射到一个URL——因此需要进行URL配置。
首先创建urls.py
文件,您的app目录树应当如下所示。
polls/
__init__.py
admin.py
apps.py
migrations/
__init__.py
models.py
tests.py
urls.py
views.py
在polls/urls.py
中写入以下代码
from django.urls import path
from . import views
urlpatterns = [
path('', views.index, name='index'),
]
下一步将url根文件配置为polls.urls
模块,在mysite/urls.py
文件中,引入模块django.urls.include
并且在urlpatterns
列表中插入include()
,具体如下所示。
from django.contrib import admin
from django.urls import include, path
urlpatterns = [
path('polls/', include('polls.urls')),
path('admin/', admin.site.urls),
]
include()
功能函数允许引入其他url配置文件,无论什么时候Django引入了include()
,都会将此处作一个分割,剩余的字符串发送到所包含的URLconf中进行进一步处理。include()
方法可以很好地实现网址即插即用。polls中的网址配置在文件polls/urls
中,它们可以放置在"/polls/","/content/polls/"或者其他路径下,应用程序依然可以很好地运行。
什么时候使用include()?
您应该在包含其他网址格式时使用include()
,admin.site.urls
是唯一一个例外。
现在您已经将index
视图函数映射到url地址中,用以下命令确认它已经正常运行。
python manage.py runserver
在浏览器中进入网址http://localhost:8000/polls/,您将看到"Hello,world.You're at the polls index",这是您在index视图函数中所定义的。
path() 参数:route
路径是一个包含URL格式的字符串。每当处理请求时,Django会在urlpatterns
列表中依次寻找匹配请求的网址路径,并且只会匹配一次。
路径格式并不会搜索GET和POST参数。比如说请求地址https://www. example.com/myapp/,路径配置文件会寻找myapp/
路径所对应的视图文件,请求地址https://www. example.com/myapp/?page=3,路径配置文件依旧会寻找myapp/
。
path() 参数:view
每当Django找到一个匹配的路径,将会调用一个以HttpRequest
对象作为第一个参数的视图函数,其余捕获值将作为关键词参数传递到视图函数中。之后将做一个示例讲解。
path() 参数:kwargs
可以在字典中可以将任意关键字参数传递给目标视图。 在本教程中,我们不会使用Django的此功能。
path() 参数:name
为您的URL命名可以在Django的其他部分,特别是在模板文件中明确地引用它。这项强大的功能可让您仅更改单个文件的一个参数即可对项目的URL格式进行全局更改。