编写你的第一个 Django app,第一部分(Page 6)转载请注明链接地址
Django 2.0.1 官方文档翻译:
Django 2.0.1.dev20171223092829 documentation
让我们从一个例子开始学习。
在本教程,我们会介绍一个基本的投票app的创建。
它由两部分组成:
- 一个允许人们查看投票(名词)和投票(动词)的公开的站点。
- 一个让你可以添加、更改和删除投票的管理站点
我们假定你已经安装好 Django。你可以在 shell 提示符后运行以下命令来查看django 是否已经被安装,并查看安装的版本。
python -m django --version
如果 django 已经被安装,你会看到一个版本号。否则,你会看到一个错误信息“No module named django”。
本教程是为 Django 2.0编写,它支持 Python 3.4及以后的版本。如果 django 的版本不匹配,你可以参考通过页面右下角的版本切换链接,切换到适合你django 版本的教程(这里没有做这个链接),或者把你的 Django 更新到最新版本(指当前版本)。如果你使用一个比较老的 python 版本,去查看 Django 应该使用哪个版本的 Python,找一个和Django 兼容的版本。
看看如何安装Django中的内容:如何删除旧版本的Django 并安装一个新版本的 django。
创建一个项目
如果这是你第一次使用 django,你需要注意一些初始设置。即,你需要自动创建一些代码来创建 django 项目 —— 一个django 实例的配置集合,包括数据库配置、django 的具体配置 和 app的具体配置。
在命令行中 cd 到一个你想保存你代码的目录里,然后运行下面的命令:
$ django-admin startproject mysite
这里会在你的当前目录创建一个 mysite
目录。如果遇到问题请查看这里(这里少一个链接)
注意:
在命名时你要避免与 Python 的内置标识符或者 Django 组件冲突。尤其是,这表示,你要便面使用像 django 或者 testt 一样的命名(命名为django会导致和 Django 冲突,命名为 test 会导致和 Python 的内置标识符冲突)
这些代码应该保存在什么位置?
如果你的环境是普通的 PHP(不使用现代框架),你可能会将代码放在 web 服务器的文档根目录(就比如说 /var/www)。在 django 这里,你不需要这样做。将你的 Python 代码放在 web 服务器的文档根目录并不是一个好主意,这可能会有让别人通过 web 查看你的代码的风险。这对安全并不友好。
把你的代码放在文档根目录以外的其他目录,比如:/home/mycode
我们来看一下startprojest(这里少一个链接) 创建了什么:
mysite/
manage.py
mysite/
__init__.py
settings.py
urls.py
wsgi.py
这些文件是什么呢?
- 外层的 mysite/ 根目录是你的项目的一个容器(意思就是你的项目的所有代码都会保存在这里),它的名字不重要,你可以把它重命名成你喜欢的名字。
- manage.py : 一个命令行工具,让你可以以多种方式与 django 项目交互,你可以在 django-admin 和 manage.py(这里少一个链接) 里查阅关于 manage.py 的详细信息。
- 内层的 mysite/ 是实际的你的项目的 python 包,它的名字是 python 包的名字,你需要使用它来导入你需要的东西(比如:mysite.urls )。
- mysite/init.py: 一个空文件,用来告诉 Python 这个目录是一个 python 包。如果你是一个 python 初学者,请去Python 官方文档中阅读关于包的内容。
- mysite/settings.py: 设置或配置 django 项目,Django setting(这里少一个链接)会告诉你所有关于setting 如何工作的内容。
- mysite/urls.py: django 项目的 URL 声明,django 站点的一个目录表。你可以在 URL dispatcher(这里少一个链接) 中阅读关于 URls 的内容。
- 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.
December 23, 2017 - 15:50:53
Django version 2.0, using settings 'mysite.settings'
Starting development server at 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/ . 你会看到一个有火箭起飞的 “Congratulations!” 页面,那么它已经开始工作了。
更改端口
默认情况下,runserver 命令会在内网 IP 的8000端口上启动开发服务器。
如果你想要更改服务器的端口,请把端口作为命令行参数传递。例如,下面的命令会在8080端口启动服务器。
$ python manage.py runserver 8080
如果你想要更改服务器的 IP,请将 IP 和端口一起传递。例如,监听所有有效的公网 IP(当你想在网络中的其他电脑上展示你的工作的时候,这会很有用),使用下面的命令:
$ python manage.py runserver 0:8000
0 是 0.0.0.0 的缩写。开发服务器的完整文档可以在 runserver 的参考手册里找到(这里少一个链接)。
runserver的自动重载
开发服务器会根据需要自动重载 python 代码。你不需要为了让你更改过的代码生效而去重启服务器。但是,像添加文件这样的操作不会触发服务器的重启,所以在这种情况下你必须手动重启服务器
创建 Polls app
现在你的环境——一个”项目“——已经创建,你准备开始工作。
你在 django 里写的每个app都是一个遵循某些约定的 Python 包。Django 自带的自动生产代码工具会生成 app 的基础目录结构,所以你可以专注于写代码而不是去创建目录。
项目 VS apps (Projects vs. apps)
项目和app有什么区别?一个app是一个可以做一些事情的 web app程序——例如,一个博客系统、一个存储公共记录的数据库或者一个简单的投票app。而项目是一个网站的配置与app的集合。一个项目可以包含多个app。一个app可以运用到多个项目(意思是一个项目中的app可以复制到其他项目中使用)。
你的app可以保存在你 Python path下的任何位置。在本教程里,我们将在 manage.py 文件同级目录中创建我们的投票app,让app作为一个*的模块被导入,而不是 mysite 的子模块。
要创建你的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
poll app将基于这个目录结果。
编写你的第一个视图(view)
我们来开始写第一个视图,打开 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.")
这可能是 Django 里最简单的视图,要调用视图,我们需要把它映射到一个 URL —— 要这样我们还需要一个 URLconf。
在 polls 目录创建一个 URLconf 只要创建一个叫 urls.py 文件即可。你的app的目录现在看起来会是这个样子。
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 并在 urlpatterns 列表中插入一个 include()(这里少一个链接),代码如下:
# mysite/urls.py
from django.urls import include, path
from django.contrib import admin
urlpatterns = [
path('polls/', include('polls.urls')),
path('admin/', admin.site.urls),
]
include()函数允许引用其他的 URLconf。每当 django 遇到 include(),它会截取 URL 中匹配到的前面的部分,并将剩余部分的字符串发送给包含的 URLconf 做进一步处理。
include()背后的思想是使 URL 成为更易于使用的即插即用式 URL。因为 polls 已经在它自己的 URLconf 中(polls/urls.py),他们可以放在“/polls/”下,或者 “/fun_polls/”下,或者 “/fun_polls/”下,或者任何路径的根下,app都可以工作。
使用 include()时
当包含其他 URL 模式时,你应该总是使用 include()。唯一的例外是 admin.site.urls。
现在已经将 index 视图连接到 URLconf。让我们运行下面的命令来验证它的工作状态:
$ python manage.py runserver
在浏览器中访问 http://localhost:8000/polls/ ,你应该可以看到你在 index 视图中定义的内容: “Hello, world. You’re at the polls index.”
path()函数需要四个参数,其中两个是必选的:route 和 view,两个可选的:kwargs 和 name. 在这里,可以研究一下这些参数是什么。
path()参数:route
route 是一个包含 URL 模式的字符串,当处理一个请求时,django 从urlpatterns 列表下的第一个正则表达式模式开始,将请求的 URL 依次与每一个正则表达式进行比对,直到找到匹配的那一条。
正则表达式不搜索 GET 和 POST 参数或者域名,例如:https://www.example.com/myapp/ 这个请求会在 URLconf 中查找 myapp/;https://www.example.com/myapp/?page=3 这个请求会在 URLconf 中查找myapp/。
path()参数:view
当 Django 找到一个匹配的正则表达式,它会调用特定的将 HttpRequest(这里少一个链接) 作为第一个参数,从路由里捕获的值作为关键字参数的视图函数。后面我们会举一个这样的例子。
path()参数:kwagrs
字典中的任意关键字参数都可以传递给目标函数,本教程中,我们不打算使用 Django 的这个特性。
path()参数:name
命名你的 URL,让你可以在 Django 中的其他地方可以明确的引用它,特别是在模板(templates)中。这个强大的特性允许你只修改一个文件就可以对项目中的 URL 模式进行一个全局的更改。
当你熟悉了基本的请求与相应流时间,可以去下一节了解使用数据库工作。(Page 7)这里少一个链接