1.1.4 创建应用

项目已经创建好,网站也有了,接下来要实现网站的具体功能。在Django中,把这些具体的功能称为“应用”(application)。

进入刚才创建的项目目录中,即manage.py文件所在的目录,然后按照下面的方式操作:

    $ ls
    db.sqlite3   manage.py    mysite
    $ python3 manage.py startapp blog   #①
    $ ls
    blog    db.sqlite3   manage.py    mysite

从上述操作中可以看出,执行了语句①之后,在目录中多了一个名为blog的目录。如果观察这时候的mysite2目录结构,会看到blog里面已经有默认的文件和目录了,如图1-6所示。

图1-6 含有blog应用的目录结构

blog就是项目mysite中的一个应用。在新的应用创建后,Django会自动在这个应用中增加一些文件。

请认真观察图1-6所示的项目结构,其中不仅有新建的应用blog,还有mysite目录和manage.py等文件。目前这已经是一个相对完善的网站项目结构了,下面依次对各个部分进行简要说明。

1. manage.py

在了解manage.py之前,先讲解创建项目时用到的django-admin.py,它是Django的任务管理命令行工具。可以通过下面的方式查看django-admin命令的帮助信息和所支持的命令行参数:

    $ django-admin
    Type 'django-admin help <subcommand>' for help on a specific subcommand.
    Available subcommands:
    [django]
        check
        compilemessages
        createcachetable
        dbshell
        diffsettings
        dumpdata
        flush
        inspectdb
        loaddata
        makemessages
        makemigrations
        migrate
      runserver
      sendtestemail
      shell
      showmigrations
      sqlflush
      sqlmigrate
      sqlsequencereset
      squashmigrations
      startapp
      startproject
      test
      testserver

请读者耐心地把这些命令行参数都看一下,留个印象。

看到startapp和startproject了吧!在创建项目的命令中,我们使用了startproject。这里还有一个startapp,这个参数在刚刚创建的操作①中出现了,但不是用在django-admin后面,而是用于python manage.py的参数,那么这里的startapp是什么意思呢?

    $ django-admin help startapp
    usage: django-admin startapp [-h] [--template TEMPLATE]
                            [--extension EXTENSIONS] [--name FILES]
                            [--version] [-v {0,1,2,3}] [--settings SETTINGS]
                            [--pythonpath PYTHONPATH] [--traceback]
                            [--no-color] [--force-color]
                            name [directory]

   Creates a Django app directory structure for the given app name in the current
    directory or optionally in the given directory.

   positional arguments:
      name               Name of the application or project.
      directory           Optional destination directory

   optional arguments:
      -h, --help          show this help message and exit
      --template TEMPLATE  The path or URL to load the template from.
      --extension EXTENSIONS, -e EXTENSIONS
                        The file extension(s) to render (default: "py").
                        Separate multiple extensions with commas, or use -e
                        multiple times.
      --name FILES, -n FILES
                        The file name(s) to render. Separate multiple file
                        names with commas, or use -n multiple times.
      --version           show program's version number and exit
      -v {0,1,2,3}, --verbosity {0,1,2,3}
                        Verbosity level; 0=minimal output, 1=normal output,
                        2=verbose output, 3=very verbose output
    --settings SETTINGS  The Python path to a settings module, e.g.
                      "myproject.settings.main". If this isn't provided, the
                      DJANGO_SETTINGS_MODULE environment variable will be
                      used.
    --pythonpath PYTHONPATH
                      A directory to add to the Python path, e.g.
                      "/home/djangoprojects/myproject".
    --traceback         Raise on CommandError exceptions
    --no-color          Don't colorize the command output.
    --force-color       Force colorization of the command output.

用django-admin help来查看一下,发现startapp这个参数也是用于创建应用的,与python3 manage.py startapp application_name中startapp的功能一样。

仔细地阅读帮助信息,然后把刚刚建立的项目中的blog应用删除,再用django-admin startapp blog试一下:

    Chees-MBP:mysite2 qiwsir$ ls
    blog    db.sqlite3   manage.py    mysite
    Chees-MBP:mysite2 qiwsir$ rm -rf ./blog
    Chees-MBP:mysite2 qiwsir$ ls
    db.sqlite3   manage.py    mysite
    Chees-MBP:mysite2 qiwsir$ django-admin startapp blog   #②
    Chees-MBP:mysite2 qiwsir$ ls
    blog    db.sqlite3   manage.py    mysite

语句②和语句①的形式不同,但效果一样,也建立了应用blog,如果用tree命令查看目录结构,会发现与前面的目录结构一模一样。

既然django-admin startapp blog和python manage.py startapp blog是殊途同归的,那么manage.py是什么呢?

在创建一个Django项目后,manage.py在项目的根目录中被自动生成,它是对django-admin.py的简单封装,同样能够实现命令行操作:

    Chees-MBP:mysite2 qiwsir$ python3 manage.py
    Type 'manage.py help <subcommand>' for help on a specific subcommand.
    Available subcommands:
    [auth]
        changepassword
        createsuperuser
    [contenttypes]
        remove_stale_contenttypes
    [django]
        check
        compilemessages
        createcachetable
        dbshell
        diffsettings
        dumpdata
        flush
        inspectdb
        loaddata
        makemessages
        makemigrations
        migrate
        sendtestemail
        shell
        showmigrations
        sqlflush
        sqlmigrate
        sqlsequencereset
        squashmigrations
        startapp
        startproject
        test
        testserver
    [sessions]
        clearsessions
    [staticfiles]
        collectstatic
        findstatic
        runserver

与django-admin进行对比,两者内容大体相同,同时manage.py还有自己的特点。

django-admin命令对应着django-admin.py文件,它在Django安装后保存在Django安装目录的/bin下面。

而mange.py只在建立了一个项目之后,才存在于项目的根目录中。

关于这两种命令行方式的更多辨析,读者可以阅读官方提供的内容:https://docs. djangoproject.com/en/2.1/ref/django-admin。注意观察这个地址,其中“2.1”表示的是Django版本号。如果读者使用的版本与本书有异,一般来讲修改这个版本号即可查看相应内容。

最后提示读者,对于项目根目录中的manage.py文件,不要修改,也不要删除,后面我们会经常使用它。

2. mysite

mysite是所建项目的管理功能目录(不是项目所在的目录mysite2),这个目录的名称因用户所创建的项目名称的不同而异,虽然可以在这个目录中输入应用部分的内容,但在类似本书的多应用项目中一般不这么做。它包含的几个文件常用于面向整个项目进行参数配置。

· settings.py:这个文件中包括了项目的初始化设置,可以针对整个项目进行有关参数配置,比如配置数据库、添加应用等。

· urls.py:这是一个URL配置表文件(或称为“模块”,在Python中,模块就是程序文件。此URL配置文件/模块,英文表示为URLconf,即URL configureation),主要将URL映射到应用程序上。当用户请求某个URL时,Django项目会根据这个文件中的映射关系指向某个目标对象,该对象可以是某个应用中的urls.py文件,也可以是某个具体的视图函数。

· wsgi.py:WSGI是Web Server Gateway Interface的缩写。读者可能听说过CGI, CGI是Common Gateway Interface的缩写,与WSGI有所不同。WSGI是Python所选择的服务器和应用标准,Django也会使用。wsgi.py文件定义了我们所创建的项目都是WSGI应用。关于WSGI的更多知识可以参阅http://wsgi.readthedocs.io/en/latest/index.html

· __pycache__:如果创建项目后,不执行python manage.py runserver命令,不在浏览器中查看网站是否运行,那么它是不存在的。只有网站运行后,它才会出现。它其实是一个编译后的文件夹。看一下里面的文件,都是以.pyc结尾的文件。关于编译问题,笔者已经在《跟老齐学Python:轻松入门》中讲述过了,请查看相关章节。

3. blog

blog是在项目中所创建的应用之一,注意是之一,用创建应用的指令还可以创建很多其他的应用。每创建一个新的应用,Django就会在项目根目录(./)中创建一个子目录,并且目录中会有一些默认的文件。

· admin.py:在这个文件中,可以自定义Django管理工具,比如设置在管理界面能够管理的项目,或者通过重新自定义与系统管理有关的类对象,向管理功能增加新的内容。

· apps.py:这个文件是Django 1.10之后增加的,通常包含对应用的配置,比如为管理功能提供一个合适的应用名称。

· migrations:这是一个目录,用于存储应用的数据库表结构的指令,通过这些指令可以修改和创建数据库,从而在models.py模型类和数据库表之间迁移。

· models.py:这是应用的数据模型,每个Django应用都应当有一个models.py文件,虽然该文件可以为空,但不宜删除。

· tests.py:在这个文件中可以编写测试文档来测试所建立的应用。

· views.py:这是一个重要的文件,用于保存响应各种请求的函数或者类。如果编写的是函数,则称为基于函数的视图;如果编写的是类,则称为基于类的视图。views.py就是保存函数或者类的视图文件。当然,也可以用其他的文件名称,只不过在引入相应函数或者类时,要注意名称的正确性,views.py是我们习惯使用的文件名称。

4. db.sqlite3

这是一个默认的数据库。SQLite是Python默认安装的数据库,在Django中也可以默认使用。因为到现在为止我们还没有配置数据库,所以就有了一个默认的文件(这个默认文件是在./mysite/settings.py中配置生成的)。

至此,读者已经初步了解了Django项目的基本结构。若要让网站呈现纷繁多样的功能,还需要进行一些配置。