- 跟老齐学Python:Django实战(第2版)
- 齐伟编著
- 2358字
- 2020-08-28 00:57:19
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项目的基本结构。若要让网站呈现纷繁多样的功能,还需要进行一些配置。