Python / 07 Django 项目组成部分剖析

Django 项目组成部分剖析

这一小节我们主要介绍用 Django 开发的项目的几个重要组成部分以及操作的相关命令。

1. Django 项目说明

Django 项目主要是由多个 app 组成,app 这个概念特别像 Java 中的模块。我们将实现不同的功能放到不同的 app 中,这样会让整个项目结构看起来清晰分明。此外,在 Django 给我们生成的初始化工程以及初始化应用中的代码文件都有着相应的含义,我们需要遵循 Django 规范才能让整个项目代码看着结构清晰,功能明确。

2. Django 项目代码文件说明

在我们前面初次创建 first_django_app 工程时,可以看到 django-admin 命令为我们生成了如下的代码文件:

[root@server first_django_app]# tree .
.
├── first_django_app
│   ├── __init__.py
│   ├── settings.py
│   ├── urls.py
│   └── wsgi.py
├── manage.py

图片描述

项目初见

2.1 manage.py 文件

manage.py 是一个命令行工具,用于与 Django 进行不同方式的交互脚本,通过 python manage.py help 命令,我们可以看到 manage.py 文件支持的所有操作:

(django-manual) [root@server first_django_app]# python manage.py help
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

比较常用的命令有:

  • createsuperuser:创建超级用户,用来登录 Django 自带的管理系统;

  • shell:进入shell 模式可以直接对 Django 中的模型进行增删改查等测试,这个后续介绍 Django 的 ORM 模型中使用;

  • makemigrations/migrate:用来进行数据库迁移工作的,比如我们修改了数据库的表的字段,然后需要保存修改,直接使用makemigrations 生成迁移文件,然后到了新环境使用 migrate 命令根据迁移文件生成相应的数据表;

  • showmigrations:查看迁移表中的信息;

    (django-manual) [root@server first_django_app]# python manage.py showmigrations
    admin
     [ ] 0001_initial
     [ ] 0002_logentry_remove_auto_add
     [ ] 0003_logentry_add_action_flag_choices
    auth
     [ ] 0001_initial
     [ ] 0002_alter_permission_name_max_length
     [ ] 0003_alter_user_email_max_length
     [ ] 0004_alter_user_username_opts
     [ ] 0005_alter_user_last_login_null
     [ ] 0006_require_contenttypes_0002
     [ ] 0007_alter_validators_add_error_messages
     [ ] 0008_alter_user_username_max_length
     [ ] 0009_alter_user_last_name_max_length
     [ ] 0010_alter_group_name_max_length
     [ ] 0011_update_proxy_permissions
    contenttypes
     [ ] 0001_initial
     [ ] 0002_remove_content_type_name
    sessions
     [ ] 0001_initial
    
  • startproject/startapp:创建项目和应用。这里我们发现它的作用和前面使用 django-admin startproject/startapp 作用是一样的;

  • runserver:在调试时会常常使用。例如下面的操作,启动 Django 内置的 Web 服务器,监听8000端口,等待 HTTP 请求:

    (django-manual) [root@server first_django_app]# python manage.py runserver 0.0.0.0:8000
    Watching for file changes with StatReloader
    Performing system checks...
    
    System check identified no issues (0 silenced).
    
    You have 17 unapplied migration(s). Your project may not work properly until you apply the migrations for app(s): admin, auth, contenttypes, sessions.
    Run 'python manage.py migrate' to apply them.
    
    March 14, 2020 - 13:47:04
    Django version 2.2.11, using settings 'first_django_app.settings'
    Starting development server at http://0.0.0.0:8000/
    Quit the server with CONTROL-C.
    
    

2.2 first_django_app/settings.py 文件

Django 的全局配置文件,非常重要。这里将介绍 setting.py 中非常重要的一些配置:

  • DEBUG:调试开关,生产环境绝对禁止;

  • ALLOWED_HOSTS : 访问地址白名单,如果想让所有机器都能访问,直接设置 ['*']即可;

  • INSTALLED_APPS:非常重要,所有使用 startapp 生成的应用,必须在这里添加;

  • MIDDLEWARE:Django 的中间件,帮助我们在视图函数执行之前和执行之后做一些额外的操作;

  • ROOT_URLCONF:指定全局的 URL 映射入口地址;

  • DATABASES: 数据库配置,在这里可以指定单个数据库或者多个数据库;

  • STATIC_URL: 静态资源地址。

2.3 first_django_app/urls.py

Django 的 URL 映射入口,非常重要。URL 路由配置实质上就是一个 URL 与视图函数之间的映射表。我们在浏览器上敲下 URL 时,浏览器会根据指定的 IP + PORT 找到我们这个 Django 服务,然后通过 URL 后续的 path 部分来到这里映射的总入口一行行匹配,直到找到匹配的视图函数处理;否则在遍历完映射表后会返回 404 错误。

2.4 first_django_app/wsgi.py

一个基于 WSGI 的web服务器进入点,提供底层的网络通信功能。在使用 uWSGI 服务器启动时,指定好该位置即可。

3. Django 应用文件说明

接下来,我们进入创建的应用目录中,来看下初始的应用代码文件有哪些。

(django-manual) [root@server first_django_app]# cd hello_app/
(django-manual) [root@server hello_app]# ls
admin.py  apps.py  __init__.py  migrations  models.py  tests.py  views.py
(django-manual) [root@server hello_app]# tree .
.
├── admin.py
├── apps.py
├── __init__.py
├── migrations
│   └── __init__.py
├── models.py
├── tests.py
└── views.py

1 directory, 7 files
  • admin.py:映射 models 中的数据到 Django 自带的 admin 后台,里面的代码;

  • app.py:这个在Django 2.0 版本中新增,只有一个类,设置了应用的名称;

    from django.apps import AppConfig
    
    class HelloAppConfig(AppConfig):
        name = 'hello_app'
    
  • migrations:目录,这里将会放这个应用对应迁移的数据表。在项目开发过程中或者完成后,我们会通过python manage.py makemigrations app_name 将该应用的数据表结构以及必要数据保存到这个目录下,方便后续数据迁移;

  • models.py:这个文件是专门用来定义应用中涉及的数据表模型(大部分时候对应的数据表);

  • tests.py:很明显,这个是用来写测试用例的文件;

  • view.py:这里是用来编写 URL 对应的视图函数的,这里一般放着应用所有业务的逻辑处理代码。

以上这些代码文件是 Django 在创建应用时给我们自动生成的,通常我们不会改动这些文件名,而是直接在对应的文件中编写相应的代码,这些都是 Django 自己的规范,也是为了使项目中代码文件的功能清晰明了。但是,往往 Django 应用中,我们会添加很多自己的代码文件,最重要的有两个:urls.pyserializers.py

  • urls.py:将本应用的 URL 与 视图映射关系放到这个文件中;

  • serializers.py: 将应用中数据库模型字段的序列化和反序列化逻辑放到这个文件中统一处理。

4. 小结

本小节我们介绍了 Django 在最开始生成第一个工程的重要文件,接下来也对生成应用的代码文件进行了说明,这些都是后续开发 Django 项目的基础。