工具
Web 开发
Web 服务
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
运行项目:
$ 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
必填,包含一个 URLview
必填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 个步骤:
- 在
models.py
维护 Model - 运行
python3 manage.py makemigrations
- 运行
python3 manage.py migrate