编写第一个Django应用 (一)

本文是Django系列文章,请到无聊才读书的博客了解更多详细信息。
编写第一个Django应用,第1部分

在本教程中,我们将引导您完成基本民意调查应用程序的创建。

它由两部分组成:

  • 一个允许人们查看民意测验并对其进行投票的公共站点。
  • 一个允许您添加,更改和删除民意调查的管理站点。

我们假设您已经安装Django。您可以通过在shell提示符(以$前缀表示)中运行以下命令来告诉Django已安装以及安装了哪个版本:

$ python -m django --version

如果安装了Django,则应该看到安装的版本。如果不是,您将得到一个错误消息,提示“没有名为django的模块”。

本教程是为Django 2.2编写的,它支持Python 3.5及更高版本。如果Django版本不匹配,则可以使用此页面右下角的版本切换器来参考您的Django版本的教程,或将Django更新为最新版本。如果您使用的是Python的旧版本,请检查我可以在Django中使用哪个Python版本?找到兼容版本的Django。

请参阅如何安装Django,以获取有关如何删除Django的较早版本并安装较新版本的建议。

在哪里获得帮助:
如果您在阅读本教程时遇到麻烦,请向django用户发布消息,或在irc.freenode.net上通过#django来与其他可能会提供帮助的Django用户聊天。

创建项目

如果这是您第一次使用Django,则必须进行一些初始设置。即,您将需要自动生成一些代码来建立Django 项目 -Django实例的一组设置,包括数据库配置,特定于Django的选项和特定于应用程序的设置。

从命令行cd进入要存储代码的目录,然后运行以下命令:

$ django-admin startproject mysite

这将mysite在当前目录中创建一个目录。如果它不起作用,请参阅运行django-admin时遇到的问题

注意
您需要避免使用内置的Python或Django组件来命名项目。特别是,这意味着您应该避免使用类似 django(与Django本身冲突)或test(与内置Python包冲突)之类的名称。

该代码应该放在哪里?
如果您的背景是纯朴的旧PHP(不使用现代框架),则可能习惯于将代码放在Web服务器的文档根目录下(例如/var/www)。使用Django,您无需这么做。将任何这些Python代码放在​​Web服务器的文档根目录中不是一个好主意,因为这冒着人们可能能够通过Web查看您的代码的风险。这对安全性不利。

将代码放在文档根目录之外的某个目录中,例如 /home/mycode

让我们看看startproject创建了什么:

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

这些文件是:

  • 外部mysite/根目录只是您的项目的容器。它的名称与Django无关;您可以将其重命名为任何喜欢的名称。
  • manage.py:一个命令行实用程序,可让您以各种方式与该Django项目进行交互。您可以manage.pydjango-admin和manage.py中阅读有关的所有详细信息 。
  • 内部mysite/目录是项目的实际Python包。它的名称是Python包名称,您需要使用它来导入其中的任何内容(例如mysite.urls)。
  • mysite/__init__.py:一个空文件,告诉Python该目录应视为Python软件包。如果您是Python初学者,请在Python官方文档中阅读有关包的更多信息
  • mysite/settings.py:此Django项目的设置/配置。 Django设置将告诉您所有设置的工作方式。
  • mysite/urls.py:此Django项目的URL声明;Django支持的网站的“目录”。您可以在URL调度程序中阅读有关URL的更多信息。
  • 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.

October 16, 2019 - 15:50:53
Django version 2.2, 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服务器。)

现在服务器已在运行,请使用Web浏览器访问http://127.0.0.1:8000/。您会看到“恭喜!”页面,其中一枚火箭正在起飞。有效!

更改端口
默认情况下,该runserver命令在内部IP的端口8000上启动开发服务器。
如果要更改服务器的端口,请将其作为命令行参数传递。例如,此命令在端口8080上启动服务器:
$ python manage.py runserver 8080
如果要更改服务器的IP,请将其与端口一起传递。例如,要侦听所有可用的公共IP(如果您正在运行Vagrant或想在网络上的其他计算机上炫耀您的工作,这很有用),请使用:
$ python manage.py runserver 0:8000
00.0.0.0的快捷方式。有关开发服务器的完整文档,请参见runserver参考资料。

自动重新加载 runserver

开发服务器会根据需要自动为每个请求重新加载Python代码。您无需重新启动服务器即可使代码更改生效。但是,某些操作(例如添加文件)不会触发重新启动,因此在这种情况下,您必须重新启动服务器。


创建民意调查应用程序

现在,您的环境(一个“项目”)已设置好,您就可以开始工作了。

您在Django中编写的每个应用程序都包含一个遵循特定约定的Python包。Django附带了一个实用程序,该实用程序会自动生成应用程序的基本目录结构,因此您可以专注于编写代码,而不是创建目录。

项目与应用
项目和应用之间有什么区别?应用程序是执行某项操作的Web应用程序,例如Weblog系统,公共记录数据库或简单的民意调查应用程序。项目是特定网站的配置和应用程序的集合。一个项目可以包含多个应用程序。一个应用程序可以在多个项目中。

您的应用程序可以放在Python路径上的任何位置。在本教程中,我们将在manage.py 文件旁边创建轮询应用程序,以便可以将其作为自己的顶级模块(而不是的子模块)导入mysite

要创建您的应用,请确保与您位于同一目录,manage.py 然后键入以下命令:

$ python manage.py startapp polls

这将创建一个目录polls,其布局如下所示:

polls/
    __init__.py
    admin.py
    apps.py
    migrations/
        __init__.py
    models.py
    tests.py
    views.py

此目录结构将容纳轮询应用程序。


写下您的第一个视图

让我们来写第一个视图。打开文件polls/views.py ,并将以下Python代码放入其中:

polls/views.py

from django.http import HttpResponse

def index(request):
    return HttpResponse("Hello, world. You're at the polls index.")</font>

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

要在民意调查目录中创建URLconf,请创建一个名为urls.py的文件。您的应用目录现在应如下所示:

polls/
    __init__.py
    admin.py
    apps.py
    migrations/
        __init__.py
    models.py
    tests.py
    urls.py
    views.py

polls/urls.py文件中包含以下代码:

polls/urls.py

from django.urls import path

from . import views

urlpatterns = [
    path('', views.index, name='index'),
]

下一步是将根URLconf指向该polls.urls模块。在中 mysite/urls.py,添加的导入django.urls.include并将插入 include()urlpatterns列表中,因此您具有:

mysite/urls.py

from django.contrib import admin
from django.urls import include, path

urlpatterns = [
    path('polls/', include('polls.urls')),
    path('admin/', admin.site.urls),
]

include()功能允许引用其他URLconf。每当Django遇到时include(),它都会截断直到该时间点匹配的URL的任何部分,并将剩余的字符串发送到包含的URLconf中以进行进一步处理。

背后的想法include()是简化URL的即插即用。由于民意调查位于其自己的URLconf(polls/urls.py)中,因此可以将其放在“ / polls /”下,或者“ / fun_polls /”下,或者“ / content / polls /”下或任何其他路径根下,并且该应用仍会工作。

何时使用 include()
include()包括其他URL模式时,应始终使用。 admin.site.urls是唯一的例外。

现在,您已将index视图连接到URLconf。验证它是否与以下命令一起使用:

$ python manage.py runserver

在浏览器中转到http:// localhost:8000 / polls /,您应该看到文本“ Hello,world。您正在民意调查索引中。”(您在index视图中定义的) 。

网页未找到?
如果您在这里看到错误页面,请检查您是否要访问 http:// localhost:8000 / polls /而不是http:// localhost:8000 /

path()函数传递了四个参数,两个是必需的 routeview,以及两个可选的kwargsname。在这一点上,有必要回顾一下这些论点的含义。

path()参数:route

route是包含URL模式的字符串。在处理请求时,Django从第一个模式开始,urlpatterns然后沿列表向下移动,将请求的URL与每个模式进行比较,直到找到匹配的URL。

模式不搜索GET和POST参数或域名。例如,在对的请求中https://www.example.com/myapp/,URLconf将寻找 myapp/。在请求中https://www.example.com/myapp/?page=3,URLconf也将寻找myapp/

path()参数:view

当Django找到匹配的模式时,它将使用HttpRequest对象作为第一个参数,并将路线中所有“捕获的”值作为关键字参数,调用指定的view函数。我们将举一个例子。

path()参数:kwargs

可以在字典中将任意关键字参数传递给目标视图。在本教程中,我们将不使用Django的此功能。

path()参数:name

命名URL可以使您在Django中的其他地方(尤其是在模板内部)明确地引用它。这项强大的功能可让您仅触摸单个文件即可对项目的URL模式进行全局更改。

如果您对基本的请求和响应流程感到满意,请阅读 本教程的第2部分,开始使用数据库。

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

推荐阅读更多精彩内容