Django概述
Python Django Web 框架的简要概述
1. 初始化
1.1 安装
安装 Django 框架
$ pip install Django1.2 创建项目
一个网站 配置 和 应用 的集合
# cd 到 uci-dashboard 项目文件夹
$ cd uci-dashboard
# 创建 Django 项目 uci
$ django-admin startproject uci .- django-admin.py:用于管理任务的 CLI 工具
其目录结构如下
- uci 项目工程目录
__init__.pyasgi.py兼容ASGI服务器的入口settings.pyDjango的配置文件urls.pyURL声明,配置路由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__.pyadmin.pyapps.pymodels.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 collectstatic2.5 数据库
PostgreSQL 为例
PostgreSQL - Django 文档 | 适配器 psycopg2
目前 Django v4.1 配套使用的还是 psycopg2 , 源码 \django\db\backends\postgresql\base.py
pip install psycopg2-binary未来或许会使用 适配器 psycopg3
安装
psycopg3pip 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