Django概述
Python Django Web 框架的简要概述
1. 初始化
1.1 安装
安装 Django 框架
$ pip install Django
1.2 创建项目
一个网站 配置 和 应用 的集合
# cd 到 uci-dashboard 项目文件夹
$ cd uci-dashboard
# 创建 Django 项目 uci
$ django-admin startproject uci .
- django-admin.py:用于管理任务的 CLI 工具
其目录结构如下
- uci 项目工程目录
__init__.py
asgi.py
兼容ASGI
服务器的入口settings.py
Django
的配置文件urls.py
URL
声明,配置路由wsgi.py
兼容WSGI
服务器的入口
manage.py
管理Django
项目的命令行工具
启动项目
$ python manage.py runserver # 0.0.0.0:8088
- manage.py:管理 Django 项目的 CLI 工具,是
django-admin.py
的简单包装
1.3 创建应用
应用是 专做某件事 的 网络应用程序,项目可以包含 多个应用
$ python manage.py startapp account
此时目录为
- account 认证应用
- migrations 数据库初始化相关
__init__.py
__init__.py
admin.py
apps.py
models.py
编写 模型 文件tests.py
用来测试views.py
编写 视图 文件
- migrations 数据库初始化相关
- uci
manage.py
MVC 模式: 将 Web 应用 分为三层
- 视图(
View
层):页面交互 - 模型(
Model
层):构建数据模型 - 控制器(
Controller
层):处理业务逻辑
MTV 模式:
- 就是把 View 层 改为 模板(
Template
层) 上古时期用Jinjia
模板搞 SSR 渲染 ,后面前端崛起演变为前后端分离应用 - 把 Controller 层 改为 View 层 来处理业务逻辑
- 多了个 url 映射器(路由),用来分发请求给 View 层 处理
2. 应用指北
2.1 views
处理逻辑,类比 MVC 的 Controller(控制层),有两个核心对象,请求 与 响应
HttpRequest: 请求对象,Django 自动创建 ,view 层 默认接收的第一个参数
request``isinstance(request,HttpRequest)
可检测QueryDict
对象,GET/POST
请求的实例化对象,处理 URL 的多个kv
值
HttpResponse: 响应对象,view 层 需要 手动创建 返回
属性 & 方法 | django.shortcuts
:便捷函数 快捷方式
FBV 与 CBV
2.2 urls
将 路由 和 视图 做映射绑定
支持 函数 映射
from account import views urlpatterns = [ # path(正则表达式, views视图函数,参数,别名) path('admin/', admin.site.urls), + path('account/', views.login, name='account') ]
支持 类 映射
from account.views import Account + path('account/', Account.as_view(), name='account')
支持 子路由 分发
在
account
应用下创建urls.py
文件,并写入路由from django.urls import path from . import views urlpatterns = [ path('', views.index, name='index'), # name 起别名 ]
项目的
urls.py
下引入# 在应用下创建 urls.py 文件 from django.urls import include, path + path('account/', include('account.urls'))
路径
path
支持 正则、无/命名分组支持 额外字典参数 ,在 view 层 可利用参数
key值
接收
2.3 models
定义应用的 数据模型
自动创建数据库
$ python manage.py makemigrations $ python manage.py migrate
异常时简单粗暴处理方式
migrations
目录下除__init__.py
外,全删掉删库,之后再建个新库
再重复上述,自动创建数据库命令
若出现
expected str, bytes or os.PathLike object, not NoneType
- 删除
migrations
文件夹 - 运行
python manage.py makemigrations
+app_name
- 删除
清空数据库
$ python manage.py flush
创建管理后台超级用户
$ python manage.py createsuperuser ## Username (leave blank to use 'igarashi'): igarashi ## Email address: igarashi@github.com ## Password: ## Password (again): ## The password is too similar to the username. ## Bypass password validation and create user anyway? [y/N]: y ## Superuser created successfully.
2.4 settings
定义项目配置
增加 APP 应用
INSTALLED_APPS = [ # 添加 APP 应用
"django.contrib.staticfiles", # 开发支持静态,见下文
# ...
"uci.account",
]
静态文件 相关
TEMPLATES = [] # 配置模板
PROJECT_ROOT = "项目绝对路径"
MEDIA_ROOT = os.path.join(PROJECT_ROOT, "media") # 上传文件 - 绝对路径
MEDIA_URL = os.environ.get("MEDIA_URL", "/media/") # 上传应用的 - URL路径
STATIC_ROOT = os.path.join(PROJECT_ROOT, "static") # 静态文件 [部署] 的 - 绝对路径
STATIC_URL = os.environ.get("STATIC_URL", "/static/") # 静态文件应用的 - URL路径
STATICFILES_DIRS = [ # 静态文件的 目录列表
("images", os.path.join(PROJECT_ROOT, "app_name", "static", "images")),
# ...
]
# template can find file to "images/静态图片.png"
开发环境 支持静态文件
在
urls.py
下的urlpatterns
增加应用from django.contrib.staticfiles.views import serve if settings.DEBUG: urlpatterns += static("/media/", document_root=settings.MEDIA_ROOT) + [ url(r"^static/(?P<path>.*)$", serve), ]
部署时使用命令,将静态目录下所有文件拷贝到 STATIC_ROOT
目录
$ python manage.py collectstatic
2.5 数据库
PostgreSQL 为例
PostgreSQL - Django 文档 | 适配器 psycopg2
目前 Django v4.1 配套使用的还是 psycopg2
, 源码 \django\db\backends\postgresql\base.py
pip install psycopg2-binary
未来或许会使用 适配器 psycopg3
安装
psycopg3
pip install --upgrade pip # upgrade pip to at least 20.3 pip install psycopg
若在 Debian 上需要
apt install libpq5
安装连接池
pip install psycopg_pool
更为便利的库 dj-database-url
pip install dj-database-url
配置则更换为如下方式
import dj_database_url DATABASE_CONNECTION_DEFAULT_NAME = "default" DATABASES = { DATABASE_CONNECTION_DEFAULT_NAME: dj_database_url.config( default="postgres://uci:uci@localhost:5432/uci", conn_max_age=600 ), }
2.6 模板系统
将 HTML 作为字符串,利用模板引擎,硬编码到 Django 视图,进行前后不分离的 SSR 渲染,如 Jinja