开始你的第一个Django应用(part 1)

Django1.11版本的官方教程翻译。

让我们一起通过一个例子学习Django。
通过这个教程,我会带着你们手把手教你完成一个基础的民意调查web应用。
这个应用包括两个部分:

  • 一个公共站点,让人们浏览投票情况,并投出自己的一票
  • 一个管理站点,让你添加,修改,删除投票

我们假设你已经安装好了Django。你可以在通过一条命令行指令看看自己是否已经安装Django以及是什么版本的Django。

python -m django --version

如果Django已经安装,你会看到你安装的版本的版本号。如果没有,你会得到一条警告写到"No module named django"。
这个教程基于Django 1.11和Python 3.4及以后。如果Django版本不匹配,你可以去官方网站查看你的版本的对应教程,或者把你的Django更新到最新版本(译者注:1.11应该是Django1.x版本的最后一个长期支持版本)。如果你还在使用Python 2.7,你得稍微修改修改教程内的代码。(译者注:Python 3.x已经是主流了,并且一定是日后的主流,尽早使用没毛病。)

关于安装和更新Django请查看如何安装Django


创建你的第一个项目

如果这是你第一次使用Django,你得注意一些开始步骤。也就是说,你需要自动运行一些用来创建Django项目的代码,一个Django示例的设置合集,包括database configuration(数据库配置),Django-specific Options(Django选项)和application-specific settings(应用设置)。

从命令行使用cd进入你想要保存你的代码的目录,然后运行以下命令:

django-admin startproject mysite
这条命令会在当前目录中创建一个mysite目录。如果这没有用,请查看使用Django的那些问题

注意:你不能使用一些Python和Django内置的元素名来命名你的Django项目。比如你不应该使用像Django或者test这样的名字来命名自己的项目。

这个代码应该放在哪?
把任何Python代码放在你的Web服务器的文档根目录里都并不是一个明智的做法,因为有可能会让别人通过网络看到你的代码,这不太安全。
把,你的代码放在根目录之外,比如/home/mycode


来,我们看看刚刚的startproject创建了什么?

mysite/ manage.py mysite/ __init__.py settings.py urls.py wsgi.py

-最外面的mysite/根目录只是一个项目的容器,Django对这个名字并不在乎,你可以随便改名字。
-manage.py:一个命令行程序,帮助你通过各种方式和Django交互。你可以去Django-admin和manage.py查看所有的相关细节。
-里面的mysite/目录是你项目真正的Python包。你会需要用这个名字来import里面的东西。(比如 mysite.urls)
-mysite/__init__.py:一个空的文件,告诉Python这整个目录应该被看做一个Python包,如果你对Python也是个新手,可以去查看Python官方文档。
-mysite/settings.py:关于这个Django项目的配置。可以点击后面的链接查看细节。Django settings
-mysite/urls.py:这个Django项目的URL声明。一个你的Django站点的目录。你可以查看官方文档查看更多细节URL dispatcher
-mysite/wsgi.py:WSGI兼容的Web服务器为您的项目提供服务的入门点。有关详细信息,请参阅如何使用WSGI进行部署。


开发服务器

来,我们检验一下自己的Django项目。进入自己的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. April 04, 2017 - 15:50:53Django version 1.11, using settings 'mysite.settings'Starting development server at [http://127.0.0.1:8000/](http://127.0.0.1:8000/)Quit the server with CONTROL-C.

现在你已经启动了Django的开发服务器,一个完全用python写成的轻量级Web服务器。我们将这个服务器包括在Django内,开发者就不用费功夫去调试一个像Apache那样的服务器了。这样来帮助开发者快速开发。

现在,我必须提醒一下大家:不要在任何类似生产环境中使用这个服务器。这个服务器只用于开发(官方注:我们只是搞Web框架开发的,不是搞Web服务器开发的。)

现在,服务器已经运行了。通过你的浏览器访问http://127.0.0.1:8000/。
你会看到一个舒服的浅蓝色的Django欢迎页面。我们成功了!

更换借口
默认情况下,会在内部IP的8000端口启动开发服务器。
如果你想更换服务器端口,请通过命令行传递参数。比如使用8080端口
python manage.py runserver 8080
如果你想改变服务器IP,请将其和端口一起传递。例如,要监听所有可用的公共IP(如果你在使用Vagrant或者想炫耀你的工作),请使用:
python manage.py runserver 0:8000
0是0.0.0.0的快捷方式。开发服务器的完整文档可以在runserver参考中找到。
自动重新加载服务器
开发服务器根据需要自动为每个请求重新加载Python代码。你不需要重新启动服务器以使代码更改生效。但是,一些操作(如添加文件)不会触发重新启动,因此在这些情况下您必须重新启动服务器。


创建投票Web应用

现在,你的环境 - 一个“项目” - 已经建立起来,你已经可以真正开始工作了。
你在Django中编写的每个应用程序都包含了一个遵循一定约定的Python包。 Django自带一个实用程序,可以帮助你自动生成应用程序的基本目录结构,因此您可以专注于编写代码而不是不停的创建目录。

项目project和应用App?
这两个的区别是什么?
一个app是一个用于实现某个功能的Web应用,比如,一个网络博客系统,一个公共记录数据库,或是一个简单的投票应用。
一个project是为了一个网站的一系列的配置和应用的集合。
一个project可以保护多个app。
一个app可以存在于多个project里。

你的应用程序可以存在于Python路径的任何位置。在本教程中,我们会在manage.py的旁边建立这个投票应用,这样它就可以作为这个项目的顶级模块,而不是一个简单的子模块。

为了创建app,请确保你在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.")

这应该是Django中最简单的视图了。为了调用它,我们需要将它映射到一个URL,因此我们需要一个URLconf。

我们应该在polls目录中创建一个叫做urls.py的文件。
在这个文件中应该包含以下代码:

from django.conf.urls import url

from . import views

urlpatterns = [ url(r'^$', views.index, name='index'), ]

下一步,我们应该将根URLconf指向我们的polls.urls模块。在mysite/urls.py中,加入django.conf.urls.include,并且将我们的polls.urls加入urlpatterns

你的urls.py应该是这样的:

from django.conf.urls import include, url from django.contrib import admin

urlpatterns = [ url(r'^polls/', include('polls.urls')), url(r'^admin/', admin.site.urls), ]

include()函数允许引用其他URLconf。请注意,include()函数的正则表达式不具有$(字符串结尾匹配字符),而是尾部斜线。每当Django遇到include()时,它会排除与该点匹配的任何部分,并将剩余的字符串发送到包含的URLconf进行进一步处理。

include()的背后的想法是URL可以即插即用。由于民意调查是在自己的URLconf(polls / urls.py)中,它们可以放在“/ polls /”下或“/ fun_polls /”下或“/ content / polls /”或其他路径根目录下,应用程序仍然可以工作。

什么时候使用include()
当你想要导入其他的URL时,请使用include()。admin.site.urls是唯一的例外。

你看到的和教程里的不太一样?
如果你在你的文件里看到了include(admin.site.urls)而不是admin.site.urls应该是你使用了的Django版本不是1.11,而是其他的。

你已经将索引视图连接到了URLconf中。让我们来检验一下工作吧。输入以下命令行命令。

python manage.py runserver

用你的浏览器去 http://localhost.8000/polls/ ,然后你应该会看到

“Hello, world. You’re at the polls index.”

这是你的index view里定义的。

url()函数传递四个参数,regexview是必须的,kwargsname是可选的。我大概介绍一下他们的作用。

  1. regex参数

regexregular expression(正则表达式)的常用的简写。它是用于匹配字符串中的模式的语法,或者在这个例子中,用来匹配url的模式。Django从第一个正则表达式开始,并将其放在列表中,将请求的URL和每一个正则表达式比对,选出匹配的。

请注意,这些正则表达式不搜索GET和POST参数或域名。例如,在https://www.example.com/myapp/ 的请求中,URLconf将寻找myapp/。在https://www.example.com/myapp/?page=3的请求中,URLconf还将查找myapp/

如果不太明白正则表达式,请参阅维基百科的条目或者re模块的文档。此外O’Reilly系列书中的《掌握正则表达式》也非常棒。实际操作中,你并不需要成为正则表达式的专家,因为您只需要知道如何捕获简单的模式。实际上,复杂的正则表达式的查找性能会很差,所以你可能不应该依靠正则表达式的全部功能。

最后,一个有关性能的说明:这些正则表达式是第一次加载URLconf模块时会被编译。因此它们超级快(只要查找不是太复杂)。

2.view参数

当Django找到了一个正则表达式进行匹配时,Django会调用指定的视图函数,使用HttpRequest作为第一个参数,并且将正则表达式中捕获的值作为其他参数。如果正则表达式 使用简单的捕获值,则值作为位置参数传递;如果使用命名捕获,则值作为关键字参数传递。稍后会给出例子解释。

  1. kwargs参数
    任意关键词参数(keyword arguments)可以在字典中传递到目标视图。我们不会在教程中使用Django的这个功能。

4.name参数
命名你的URL,方便你在Django的其他地方明确的引用他,特别是模版中。这个强大的功能可以让你全面更改项目的URL模式,而且只接触一个文件。

如果这章基本明白了,请开始本教程的第二部分,开始学习数据库相关的知识。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 157,198评论 4 359
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 66,663评论 1 290
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 106,985评论 0 237
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,673评论 0 202
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 51,994评论 3 285
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,399评论 1 211
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,717评论 2 310
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,407评论 0 194
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,112评论 1 239
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,371评论 2 241
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 31,891评论 1 256
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,255评论 2 250
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 32,881评论 3 233
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,010评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,764评论 0 192
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,412评论 2 269
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,299评论 2 260

推荐阅读更多精彩内容