MDN wants to learn about developers like you: https://qsurvey.mozilla.com/s3/MDN-dev-survey

Learn web development

Django Tutorial Part 2: Creating a skeleton website

这篇翻译不完整。请帮忙从英语翻译这篇文章

Django教程的第二篇文章会展示怎样创建一个网站的"框架",在这个框架的基础上,你可以继续填充整站使用的settings, urls,模型(models),视图(views)和模板(templates)。

前提: 创建Django的开发环境。复习 Django教程
目标: 能够使用Django提供的工具包搭建你自己的网站工程。

概述

这篇文章会展示怎样创建一个网站的"框架",在这个框架的基础上,你可以继续填充整站使用的settings, urls,模型(models),视图(views)和模板(templates)(我们会在接下来的文章里讨论)。

搭建“框架”的过程很直接:

  1. 使用django-admin工具创建工程的文件夹,基本的文件模板和工程管理脚本(manage.py)。
  2. manage.py 创建一个或多个应用。

    注意:一个网站可能由多个部分组成,比如,主要页面,博客,wiki,下载区域等。Django鼓励将这些部分作为分开的应用开发。如果这样的话,在需要可以在不同的工程中复用这些应用。

  3.  在工程里注册新的应用。
  4. 为每个应用分配url。

为 本地图书馆网站 这个项目创建的网站文件夹和它的工程文件夹都命名为locallibrary。我们只创建一个名为catalog的应用。最高层的项目文件结构如下所示:

locallibrary/         # 网站文件夹
    manage.py         # 用来运行Django工具的脚本(由django-admin创建)
    locallibrary/     # 网站/项目文件夹(由django-admin创建)
    catalog/          # 应用文件夹 (由manage.py创建)

接下来的部分会详细讨论创建网站框架的过程,并会展示怎么测试这些变化。最后,我们会讨论在这个阶段里你可以设置的整站级的配置。

创建项目

首先打开命令行工具,进入你想要创建Django应用的地方(最好是你容易找到的地方),为新网站创建一个文件夹(这里是:locallibrary)。用cd命令进入文件夹:

mkdir locallibrary 
cd locallibrary

用django-admin startproject命令创建新项目,并进入该文件夹。

django-admin startproject locallibrary
cd locallibrary

django-admin工具会创建如下所示的文件夹结构

locallibrary/
    manage.py
    locallibrary/
        settings.py
        urls.py
        wsgi.py

locallibrary项目的子文件夹是整个网站的进入点:

  • settings.py 包含所有的网站设置。这是可以注册所有创建的应用的地方,也是静态文件,数据库配置的地方,等等。
  • urls.py 定义了网站url到view的映射虽然这里可以包含所有的url,但是更常见的做法是把应用相关的url包含在相关应用中,你可以在接下来的教程里看到。
  • wsgi.py 帮助Django应用和网络服务器间的通讯。你可以把这个当作模板。

manage.py脚本可以创建应用,和数据库通讯,启动开发用网络服务器。

创建catalog应用

接下来,在locallibrary项目里,使用下面的命令创建catalog应用(和你项目manage.py同一个文件夹下)

python3 manage.py startapp catalog

注意:Linux/Mac OS X应用可以使用上面的命令。在windows平台下应该改为: py -3 manage.py startapp catalog

如果你是windows系统,在这个部分用python3 替代py -3。

这个工具创建了一个新的文件夹,并为该应用创建了不同的文件(下面黑体所示)。绝大多数文件的命令和它们的目的有关(比如视图函数就是views.py,模型就是models.py,测试是tests.py,网站管理设置是admin.py,注册应用是apps.py),并且还包含了为项目所用的最小模板。

执行命令后的文件夹结构如下所示:

locallibrary/
    manage.py
    locallibrary/
    catalog/
        admin.py
        apps.py
        models.py
        tests.py
        views.py
        __init__.py
        migrations/

除上面所说的文件外,我们还有:

  • 一个migration文件夹,用来存储“migrations”——当你修改你的数据模型时,这个文件会自动升级你的数据库。
  • __init__.py — 一个空文件,Django/Python会将这个文件作为Python 包并允许你在项目的其他部分使用它。

注意: 你注意到上面的文件里有些缺失嘛? 尽管由views和models的文件,可是url映射,网站模板,静态文件在哪里呢?我们会在接下来的部分展示如何创建它们(并不是每个网站都需要,不过这个例子需要)

注册catalog应用

既然应用已经创建好了,我们还必须在项目里注册它,以便工具在运行时它会包括在里面(比如在数据库里添加模型时)。在项目的settings里,把应用添加进INSTALLED_APPS ,就完成了注册。

打开项目设置文件 locallibrary/locallibrary/settings.py 找到  INSTALLED_APPS 列表里的定义。 如下所示,在列表的最后添加新的一行。

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'catalog.apps.CatalogConfig', 
]

新的这行详细说明了应用配置文件在 (CatalogConfig/locallibrary/catalog/apps.py 里,当你创建应用时就完成了这个过程。

注意: 注意到INSTALLED_APPS已经有许多其他的应用了 (还有 MIDDLEWARE, 在settings的下面)。这些应用为  Django administration site 提供了支持和许多功能(包括会话,认证系统等)。

配置数据库

现在可以为项目配置数据库了——为了避免性能上的差异,最好在生产和开发中使用同一种数据库。你可以在数据库 里找到不同的设置方法(Django文档)。 

在这个项目里,我们使用SQLite。因为在展示用的数据库中,我们不会有很多并发存取的行为。同时,也因为SQLite不需要额外的配置工作。你可以在settings.py里看到这个数据库怎样配置的。(更多信息如下所示)

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.sqlite3',
        'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
    }
}

因为我们使用SQLite,不需要其他的设置了。我们继续吧!

其他项目设置

settings.py里还包括其他的一些设置,现在只需要改变时区 — 改为和 标准tz时区数据表 里的字符串相同就可以了(数据表里的TZ 列有你想要的时区)。 把TIME_ZONE的值改为你的时区,比如

TIME_ZONE = 'Asia/Shanghai'

有两个设置你现在不会用到,不过你应该留意:

  • SECRET_KEY. 这个密匙值是Django网站安全策略的一部分。如果在开发环境中没有包好这个密匙,把代码投入生产环境时最好用不同的密匙代替。(可能从环境变量或文件中读取)。
  • DEBUG. 这个会在debug日志里输出错误信息,而不是输入HTTP的返回码。在生产环境中,它应设置为false,因为输出的错误信息会帮助想要攻击网站的人。

链接URL映射器

在项目文件夹里,创建网站时同时生成了URL映射器(urls.py)。尽管你可以用它来管理所有的URL映射,但是更常用的做法是把URL映射留到它们相关的应用中。

打开locallibrary/locallibrary/urls.py 注意指导文字解释了一些使用URL映射器的方法。

"""
locallibrary URL Configuration

The `urlpatterns` list routes URLs to views. For more information please see:
    https://docs.djangoproject.com/en/1.10/topics/http/urls/
Examples:
Function views
    1. Add an import:  from my_app import views
    2. Add a URL to urlpatterns:  url(r'^$', views.home, name='home')
Class-based views
    1. Add an import:  from other_app.views import Home
    2. Add a URL to urlpatterns:  url(r'^$', Home.as_view(), name='home')
Including another URLconf
    1. Import the include() function: from django.conf.urls import url, include
    2. Add a URL to urlpatterns:  url(r'^blog/', include('blog.urls'))
"""
from django.conf.urls import url
from django.contrib import admin


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

URL 映射通过urlpatterns 变量管理,它是一个url() 函数的Python列表。 每个url() 函数要么关联某个特定视图函数,要么某个URL式样列表的测试代码。 (第二种情况下,URL式样是目标模型里的“基本URL”). urlpatterns 列表最开始定义了把所有URL映射admin到admin.site.urls的一个函数。这个函数包含了Administration 应用自己的URL映射定义。

urlpatterns 列表的下面一行插入下面的代码。这个新的URL定义把所有的catalog式样的网络请求放在模块 catalog.urls里处理 (使用相对路径 URL /catalog/urls.py).

# Use include() to add URLS from the catalog application 
from django.conf.urls import include

urlpatterns += [
    url(r'^catalog/', include('catalog.urls')),
]

现在我们把我们网站的根URL(例如127.0.0.1:8000)URL 127.0.0.1:8000/catalog/; 这是项目中唯一的应用,所以我们最好这样做。为了完成这个目标,我们使用一个特别的视图函数(RedirectView), 当url函数中的url式样被识别以后(在这个例子中是根url),就会把RedirectView里的第一个相对路径参数重定向到(/catalog)。

把下面的代码加到文件最后:

#Add URL maps to redirect the base URL to our application
from django.views.generic import RedirectView
urlpatterns += [
    url(r'^$', RedirectView.as_view(url='/catalog/', permanent=True)),
]

Django 默认不会提供CSS, JavaScript, 和图片等静态文件 。但是当你在开发环境中开发时,这些静态文件也很有用。最后,在URL映射器,你可以加上下面的代码在开发环境中使用静态文件。

把下面的代码加到文件最后:

# Use static() to add url mapping to serve static files during development (only)
from django.conf import settings
from django.conf.urls.static import static

urlpatterns += static(settings.STATIC_URL, document_root=settings.STATIC_ROOT)

注意: 有很多方法扩展urlpatterns 列表(在上面的代码里我们通过+=运算符来区分新旧代码)。我们同样可以用原先列表的定义:

urlpatterns = [
    url(r'^admin/', admin.site.urls), 
    url(r'^catalog/', include('catalog.urls')),
    url(r'^$', RedirectView.as_view(url='/catalog/', permanent=True)),
] + static(settings.STATIC_URL, document_root=settings.STATIC_ROOT)

除此以外,我们也可以包含import代码行 (from django.conf.urls import include) ,这样更容易看出我们添加的代码,通常我们把import代码行放在Python文件的开头。

最后,在catalog文件夹里创建一个名为 urls.py 的文件, 添加下面的代码urlpatterns. 我们会在编写应用时添加相关式样。

from django.conf.urls import url

from . import views


urlpatterns = [

]

测试网站框架

现在我们有了一个完整的框架项目。这个网站现在还什么都不能做,但是我们仍然要运行以下,以确保我们的更改是有效的。

在运行前,我们应该向运行数据库迁移。这会更新我们的数据库并且包含所有安装的应用(同时去除一些警告)。

运行数据库迁移

Django uses an Object-Relational-Mapper (ORM) to map Model definitions in the Django code to the data structure used by the underlying database. As we change our model definitions, Django tracks the changes and can create database migration scripts (in /locallibrary/catalog/migrations/) to automatically migrate the underlying data structure in the database to match the model.

When we created the website Django automatically added a number of models for use by the admin section of the site (which we'll look at later). Run the following commands to define tables for those models in the database (make sure you are in the directory that contains manage.py):

python3 manage.py makemigrations
python3 manage.py migrate

Important: You'll need to run the above commands every time your models change in a way that will affect the structure of the data that needs to be stored (including both addition and removal of whole models and individual fields).

The makemigrations command creates (but does not apply) the migrations for all applications installed in your project (you can specify the application name as well to just run a migration for a single project). This gives you a chance to checkout the code for these migrations before they are applied — when you're a Django expert you may choose to tweak them slightly!

The migrate command actually applies the migrations to your database (Django tracks which ones have been added to the current database).

Note: See Migrations (Django docs) for additional information about the lesser-used migration commands.

Running the website

During development you can test the website by first serving it using the development web server, and then viewing it on your local web browser. 

Note: The development web server is not robust or performant enough for production use, but it is a very easy way to get your Django website up and running during development to give it a convenient quick test. By default it will serve the site to your local computer (http://127.0.0.1:8000/), but you can also specify other computers on your network to serve to. For more information see django-admin and manage.py: runserver (Django docs).

Run the development web server by calling the runserver command (in the same directory as manage.py):

python3 manage.py runserver

 Performing system checks...

 System check identified no issues (0 silenced).
 September 22, 2016 - 16:11:26
 Django version 1.10, using settings 'locallibrary.settings'
 Starting development server at http://127.0.0.1:8000/
 Quit the server with CTRL-BREAK.

Once the server is running you can view the site by navigating to http://127.0.0.1:8000/ in your local web browser. You should see a site error page that looks like this:

Django debug page for a 404 not found error

Don't worry! This error page is expected because we don't have any pages/urls defined in the catalogs.urls module (which we're redirected to when we get an URL to the root of the site). 

Note: The above page demonstrates a great Django feature — automated debug logging. An error screen will be displayed with useful information whenever a page cannot be found, or any error is raised by the code. In this case we can see that the URL we've supplied doesn't match any of our URL patterns (as listed). The logging will be turned off during production (when we put the site live on the Web), in which case a less informative but more user-friendly page will be served.

At this point we know that Django is working! 

Note: You should re-run migrations and re-test the site whenever you make significant changes. It doesn't take very long!

Challenge yourself

The catalog/ directory contains files for the views, models, and other parts of the application. Open these files and inspect the boilerplate. 

As you saw above, a URL-mapping for the Admin site has already been added in the project's urls.py. Navigate to the admin area in your browser and see what happens (you can infer the correct URL from the mapping above).

Summary

You have now created a complete skeleton website project, which you can go on to populate with urls, models, views, and templates.

Now the skeleton for the Local Library website is complete and running, it's time to start writing the code that makes this website do what it is supposed to do. 

See also

文档标签和贡献者

 此页面的贡献者: hstaoqian
 最后编辑者: hstaoqian,