Django 学习笔记

Django 是一个 Python 框架,用于快速开发 Web 应用。

Django 快速入门

查看 Django 的版本:

$ python3 --version
Python 3.10.8
$ python3 -m django --version
4.1.2

以下代码的适配版本是 Python 3.8 和 Django 4.1。

创建一个项目:

$ django-admin startproject mysite

这个命令将创建以下文件:

mysite/
    manage.py
    mysite/
        __init__.py
        settings.py
        urls.py
        asgi.py
        wsgi.py
  • manage.py 是一个命令行工具,可以通过它与项目中的其他部分交互
  • wsgi.py 实现 WSGIApache 等 Web Server 通信

运行项目:

$ python3 manage.py runserver

打开浏览器访问 http://127.0.0.1:8000/ 即可查看默认页面。注意,Django 是一个 Web 编程框架而非专业的 Web Server,它提供的 HTTP 服务仅供开发用。

可以在命令行指定监听端口:

$ python3 manage.py runserver 8080
$ python3 manage.py runserver 0.0.0.0:8080

修改 Python 代码不必重启即可生效,但添加文件等操作则需要重启。

创建应用

以上通过 Django 创建了一个 project。一个 project 中可以包含多个 app,如下我们将创建一个新的 app:

$ python3 manage.py startapp polls

polls 是投票之意。这个 app 的布局:

polls/
    __init__.py
    admin.py
    apps.py
    migrations/
        __init__.py
    models.py
    tests.py
    views.py

一,编辑 polls/views.py 文件:

from django.http import HttpResponse

def index(req):
    return HttpResponse("Hello world. Here is the polls index.")

二,新增 polls/urls.py 文件:

from django.urls import path
from . import views

urlpatterns = [
    path('', views.index, name='index'),
]

三,编辑 mysite/urls.py 文件:

from django.contrib import admin
from django.urls import include, path

urlpatterns = [
    path('polls/', include('polls.urls')),
    path('admin/', admin.site.urls),
]

include() 将引入其他的 URL 配置,admin.site.urls 是唯一的例外。

path() 函数有 4 个参数:

  • route 必填,包含一个 URL
  • view 必填
  • kwargs 选填
  • name 选填

四,重启服务:

$ python3 manage.py runserver

通过浏览器访问:

  • http://127.0.0.1:8000/polls/
  • http://127.0.0.1:8000/admin/

数据库

Django 默认使用 SQLite 作为数据库,因此上一步创建 app 时目录中多了一个 db.sqlite3 文件。

mysite/settings.py 中有关于数据库的配置,默认配置如下:

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.sqlite3',
        'NAME': BASE_DIR / 'db.sqlite3',
    }
}

ENGINE 表示数据库引擎,Django 支持的数据库包括:

  • django.db.backends.sqlite3
  • django.db.backends.mysql
  • django.db.backends.postgresql
  • django.db.backends.oracle

settings.py

mysite/settings.py 是一个普通的 Python 模块,包含了项目的配置。

INSTALLED_APPS 包含了项目中用到的应用,默认包含以下应用:

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

一,在 MySQL 创建数据库:

> create database dj default charset=utf8;
> grant all on dj.* to 'idleworks'@'127.0.0.1' identified by 'Eneo8WMQFz34B@kZ';
> flush privileges;

二,安装 mysqlclient

$ pip3 install mysqlclient

三,初始化数据库表:

$ python3 manage.py migrate

migrate 会根据 INSTALLED_APPS 创建相应的表。登录数据库查看:

$ mysql -uidleworks -h127.0.0.1 -pEneo8WMQFz34B@kZ dj

mysql> show tables;
+----------------------------+
| Tables_in_dj               |
+----------------------------+
| auth_group                 |
| auth_group_permissions     |
| auth_permission            |
| auth_user                  |
| auth_user_groups           |
| auth_user_user_permissions |
| django_admin_log           |
| django_content_type        |
| django_migrations          |
| django_session             |
+----------------------------+

Models

一,创建一个新文件 polls/models.py

from django.db import models

class Question(models.Model):
    q_text = models.CharField(max_length = 200)
    pub_date = models.DateTimeField('date published')

class Choice(models.Model):
    question = models.ForeignKey(Question, on_delete = models.CASCADE)
    c_text = models.CharField(max_length = 200)
    votes = models.IntegerField(default = 0)

二,在 mysite/settings.py 中添加 polls.apps.PollsConfig

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

polls.apps.PollsConfig 的定义在 polls/apps.py 文件:

from django.apps import AppConfig

class PollsConfig(AppConfig):
    default_auto_field = 'django.db.models.BigAutoField'
    name = 'polls'

三,通过 makemigrations 为生成对应的数据库和表做准备:

$ python3 manage.py makemigrations polls
Migrations for 'polls':
  polls/migrations/0001_initial.py
    - Create model Question
    - Create model Choice

这里显示生成了一个文件 polls/migrations/0001_initial.py,可以打开它查看 Migration 到底做了些什么。

通过 sqlmigrate 查看生成 Model 对应的 SQL 语句:

$ python3 manage.py sqlmigrate polls 0001

注意 sqlmigrate 并不会真正执行 SQL 语句,因此这一步并不是必须的,我们只是通过它了解到 Django 是如何与数据库交互的。

通过 migrate 完成数据库操作:

$ python3 manage.py migrate
Operations to perform:
  Apply all migrations: admin, auth, contenttypes, polls, sessions
Running migrations:
  Applying polls.0001_initial... OK

在 MySQL 终端查看生成的表:

MariaDB [dj]> desc polls_question;
+----------+--------------+------+-----+---------+----------------+
| Field    | Type         | Null | Key | Default | Extra          |
+----------+--------------+------+-----+---------+----------------+
| id       | bigint(20)   | NO   | PRI | NULL    | auto_increment |
| q_text   | varchar(200) | NO   |     | NULL    |                |
| pub_date | datetime(6)  | NO   |     | NULL    |                |
+----------+--------------+------+-----+---------+----------------+
3 rows in set (0.005 sec)

MariaDB [dj]> desc polls_choice;
+-------------+--------------+------+-----+---------+----------------+
| Field       | Type         | Null | Key | Default | Extra          |
+-------------+--------------+------+-----+---------+----------------+
| id          | bigint(20)   | NO   | PRI | NULL    | auto_increment |
| c_text      | varchar(200) | NO   |     | NULL    |                |
| votes       | int(11)      | NO   |     | NULL    |                |
| question_id | bigint(20)   | NO   | MUL | NULL    |                |
+-------------+--------------+------+-----+---------+----------------+
4 rows in set (0.006 sec)

总结:记住这 3 个步骤:

  1. models.py 维护 Model
  2. 运行 python3 manage.py makemigrations
  3. 运行 python3 manage.py migrate