Django概述

五十岚2020年3月1日
大约 5 分钟

Python Django Web 框架的简要概述

文档open in new window | 操作指南open in new window | Githubopen in new window

1. 初始化

1.1 安装

安装 Django 框架

$ pip install Django

1.2 创建项目

一个网站 配置应用 的集合

# cd 到 uci-dashboard 项目文件夹
$ cd uci-dashboard

# 创建 Django 项目 uci
$ django-admin startproject uci .

其目录结构如下

  • uci 项目工程目录
    • __init__.py
    • asgi.py兼容 ASGI 服务器的入口
    • settings.pyDjango的配置文件
    • urls.pyURL声明,配置路由
    • wsgi.py兼容 WSGI 服务器的入口
  • manage.py管理 Django 项目的命令行工具

启动项目

$ python manage.py runserver # 0.0.0.0:8088

1.3 创建应用

应用是 专做某件事 的 网络应用程序,项目可以包含 多个应用

$ python manage.py startapp account

此时目录为

  • account 认证应用
    • migrations 数据库初始化相关
      • __init__.py
    • __init__.py
    • admin.py
    • apps.py
    • models.py编写 模型 文件
    • tests.py用来测试
    • views.py编写 视图 文件
  • uci
  • manage.py
1.4 MTV 模式

MVC 模式:Web 应用 分为三层

  • 视图View):页面交互
  • 模型Model):构建数据模型
  • 控制器Controller):处理业务逻辑

MTV 模式:

  • 就是把 View 层 改为 模板Template) 上古时期用 Jinjia 模板搞 SSR 渲染 ,后面前端崛起演变为前后端分离应用
  • Controller 层 改为 View 层 来处理业务逻辑
  • 多了个 url 映射器路由),用来分发请求给 View 层 处理

2. 应用指北

2.1 views

views.py 文档open in new window | 异步视图open in new window

处理逻辑,类比 MVCController控制层),有两个核心对象,请求响应

  • HttpRequest: 请求对象,Django 自动创建view 层 默认接收的第一个参数

    • request``isinstance(request,HttpRequest) 可检测
    • QueryDict 对象,GET/POST 请求的实例化对象,处理 URL 的多个 kv
  • HttpResponse: 响应对象,view 层 需要 手动创建 返回

属性 & 方法open in new window | django.shortcuts便捷函数open in new window 快捷方式

FBVCBV

2.2 urls

urls.py 文档open in new window

路由视图 做映射绑定

  • 支持 函数 映射

    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

models.py 文档open in new window | ORM 映射

定义应用的 数据模型

  • 自动创建数据库

    $ 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

settings.py 文档open in new window

定义项目配置

增加 APP 应用

INSTALLED_APPS = [										# 添加 APP 应用
	"django.contrib.staticfiles",						# 开发支持静态,见下文
    # ...
    "uci.account",
]

静态文件open in new window 相关

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 文档open in new window | 适配器 psycopg2open in new window

目前 Django v4.1 配套使用的还是 psycopg2 , 源码 \django\db\backends\postgresql\base.py

pip install psycopg2-binary

未来或许会使用 适配器 psycopg3open in new window

  • 安装 psycopg3

    pip install --upgrade pip           # upgrade pip to at least 20.3
    pip install psycopg
    

    若在 Debian 上需要

    apt install libpq5
    
  • 安装连接池

    pip install psycopg_pool
    

配置项 文档open in new window

更为便利的库 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

模板概述open in new window | 使用 & 语法open in new window

上次编辑于: 2023/3/8 08:04:18