[实验] Django 层级多链接的实现

注意:

文中的 python 系统名、mysite 项目和 myapp 应用只是站主在本次操作中随意取的名称,读者可以根据自己的喜好换成任意别的名称

正文:

步骤一:系统环境要求

1) 服务器的系统需要是 openSUSE 15.2 版本
2) 服务器要关闭防火墙
3) 服务器系统要配置好可用的软件源(最好是软件数量最多的官方版本)
4) 服务器要能够连接外网

步骤二:安装 Django

2.1 安装 Python3

[root@python ~]# zypper -n install python3

(补充:在此次操作发生时,最新的 python 版本是 3.6.12)

2.2 创建并进入 Django 项目的目录

[root@python ~]# mkdir project
[root@python ~]# cd project

2.3 将 Django 项目的目录指定为 Django 环境

[root@python project]# python3 -m venv django_env

2.4 进入 Django 环境

[root@python project]# source django_env/bin/activate
(django_env) [root@python project]# pip install django

(补充:在此次操作发生时,最新的 Django 版本是 3.2)

步骤三:创建 mysite 项目

3.1 创建 mysite 项目

(django_env) [root@python project]# django-admin startproject mysite

3.2 mysite 项目的目录

3.2.1 安装 tree 目录显示软件
(django_env) [root@python project]# zypper -n install tree
3.2.2 显示 mysite 项目的目录
(django_env) [root@python project]# cd mysite
(django_env) [root@python mysite]# tree
.
├── manage.py
└── mysite
    ├── __init__.py
    ├── asgi.py
    ├── settings.py
    ├── urls.py
    └── wsgi.py

1 directory, 5 files

3.3 Django 项目目录介绍

1) mysite 此 Django 项目的容器
2) manage.py 命令行工具,与 Django 项目进行交互
3) mysite/__init__.py 空文件,通知 Python 此项目是 1 个 Python 包
4) mysite/settings.py 此 Django 项目的配置文件
5) mysite/urls.py 此 Django 项目的 URL 声明和 Django 的网站“目录”
6) mysite/wsgi.py WSGI 兼容 Web 服务器的入口

步骤四:创建 myapp 应用

4.1 创建 myapp 应用

(django_env) [root@python mysite]# django-admin startapp myapp

4.2 myapp 应用的目录

4.2.1 显示 myapp 应用的目录
(django_env) [root@python mysite]# tree
.
├── manage.py
├── myapp
│   ├── __init__.py
│   ├── admin.py
│   ├── apps.py
│   ├── migrations
│   │   └── __init__.py
│   ├── models.py
│   ├── tests.py
│   └── views.py
└── mysite
    ├── __init__.py
    ├── asgi.py
    ├── settings.py
    ├── urls.py
    └── wsgi.py

3 directories, 13 files
4.2.2 Django 应用目录介绍

1) users/app 此 Django 应用的容器
2) users/__init__.py 空文件,通知 Python 此项目是 1 个 Python 包
3) users/admin.py 此 Django 应用自带的后台管理相关的类
4) users/app.py 此 Django 应用指定应用名的文件
5) users/migrations.py 此 Django 应用通过 Python 代码生成数据库表时里面会产生一些迁移文件
6) users/models.py 可以在里面创建一些 Python 对象并通过这些对象在数据库里创建对应的表
7) users/test.py 此 Django 应用的测试文档
8) users/views.py 此 Django 应用的视图,接收前端数据,把数据传递给后端,响应相关页面

步骤五:配置 mysite 应用和 myapp 应用

5.1 在 myapp 应用中添加 2 个网页返回值的模块

在 mysite.myapp.views.py 中添加以下内容:

......
from django.http import HttpResponse
......
def testpage1(request):
    return HttpResponse("testpage1")

def testpage2(request):
    return HttpResponse("testpage2")


补充:这里以
1) 设置 testpage1 模块并返回 testpage1 值
2) 设置 testpage2 模块并返回 testpage2 值
为例

5.2 在 myapp 应用中添加 2 个链接并设置对应的模块

创建 mysite.myapp.urls.py 并添加以下内容:

from django.conf.urls import url
from myapp.views import testpage1,testpage2

urlpatterns = [
    url(r'page1/', testpage1),
    url(r'page2/', testpage2),
]


补充:这里以
1) 设置 page1 链接对应 testpage1 模块
2) 设置 page2 链接对应 testpage2 模块
为例

5.3 在 mysite 应用中添加 1 个链接并链接 myapp 应用的链接

在 mysite.mysite.urls.py 中添加以下内容:

......
from django.conf.urls import url, include
......
urlpatterns = [
......
    url(r'^page/', include('myapp.urls')),
]

(补充:这里以设置 page 链接对应 myapp 应用的链接为例)

步骤六:启动 Django 服务

(django_env) [root@python mysite]# python manage.py runserver 0.0.0.0:8000

(补充:这里以指定本地 8000 端口启动 Django 服务为例)

步骤七:测试 Django 多链接

打开浏览器输入以下网址:

1) 127.0.0.1:8000/page/page1
2) 127.0.0.1:8000/page/page2

[实验] Django 多链接的实现

注意:

文中的 python 系统名、mysite 项目和 app 应用只是站主在本次操作中随意取的名称,读者可以根据自己的喜好换成任意别的名称

正文:

步骤一:系统环境要求

(1)服务器的系统需要是 openSUSE 15.2 版本
(2)服务器要关闭防火墙
(3)服务器系统要配置好可用的软件源(最好是软件数量最多的官方版本)
(4)服务器要能够连接外网

步骤二:安装 Django

2.1 安装 Python3

[root@python ~]# zypper -n install python3

(补充:在此次操作发生时,最新的 python 版本是 3.6.12)

2.2 创建并进入 Django 项目的目录

[root@python ~]# mkdir project
[root@python ~]# cd project

2.3 将 Django 项目的目录指定为 Django 环境

[root@python project]# python3 -m venv django_env

2.4 进入 Django 环境

[root@python project]# source django_env/bin/activate
(django_env) [root@python project]# pip install django

(补充:在此次操作发生时,最新的 Django 版本是 3.2)

步骤三:创建 mysite 项目

3.1 创建 mysite 项目

(django_env) [root@python project]# django-admin startproject mysite

3.2 mysite 项目的目录

3.2.1 安装 tree 目录显示软件
(django_env) [root@python project]# zypper -n install tree
3.2.2 显示 mysite 项目的目录
(django_env) [root@python project]# cd mysite
(django_env) [root@python mysite]# tree
.
├── manage.py
└── mysite
    ├── __init__.py
    ├── asgi.py
    ├── settings.py
    ├── urls.py
    └── wsgi.py

1 directory, 5 files

3.3 Django 项目目录介绍

(1)mysite 此 Django 项目的容器
(2)manage.py 命令行工具,与 Django 项目进行交互
(3)mysite/__init__.py 空文件,通知 Python 此项目是 1 个 Python 包
(4)mysite/settings.py 此 Django 项目的配置文件
(5)mysite/urls.py 此 Django 项目的 URL 声明和 Django 的网站“目录”
(6)mysite/wsgi.py WSGI 兼容 Web 服务器的入口

步骤四:创建 myapp 应用

4.1 创建 myapp 应用

(django_env) [root@python mysite]# django-admin startapp myapp

4.2 myapp 应用的目录

4.2.1 显示 myapp 应用的目录
(django_env) [root@python mysite]# tree
.
├── manage.py
├── myapp
│   ├── __init__.py
│   ├── admin.py
│   ├── apps.py
│   ├── migrations
│   │   └── __init__.py
│   ├── models.py
│   ├── tests.py
│   └── views.py
└── mysite
    ├── __init__.py
    ├── asgi.py
    ├── settings.py
    ├── urls.py
    └── wsgi.py

3 directories, 13 files
4.2.2 Django 应用目录介绍

(1)users/app.py 此 Django 应用的容器
(2)users/__init__.py 空文件,通知 Python 此项目是 1 个 Python 包
(3)users/admin.py 此 Django 应用自带的后台管理相关的类
(4)users/app.py 此 Django 应用指定应用名的文件
(5)users/migrations.py 此 Django 应用通过 python 代码生成数据库表时里面会产生一些迁移文件
(6)users/models.py 可以在里面创建一些 Python 对象并通过这些对象在数据库里创建对应的表
(7)users/test.py 此 Django 应用的测试文档
(8)users/views.py 此 Django 应用的视图,接收前端数据,把数据传递给后端,响应相关页面

步骤五:配置 mysite 应用和 myapp 应用

5.1 在 myapp 应用中添加两个网页返回值的模块

在 mysite/myapp/views.py 中添加以下内容:

......
from django.http import HttpResponse
......
def testpage1(request):
    return HttpResponse("testpage1")

def testpage2(request):
    return HttpResponse("testpage2")


补充:这里以
(1)设置 testpage1 模块并返回 testpage1 值
(2)设置 testpage2 模块并返回 testpage2 值
为例

5.2 在 mysite 应用中添加两个链接并设置对应的模块

在 mysite/mysite/urls.py 中添加以下内容:

......
from myapp.views import testpage1,testpage2
......
urlpatterns = [
......
    path('page1/', testpage1),
    path('page2/', testpage2),
]


补充:这里以
(1)设置 page1 链接对应 testpage1 模块
(2)设置 page2 链接对应 testpage2 模块
为例

步骤六:启动 Django 服务

(django_env) [root@python mysite]# python manage.py runserver 0.0.0.0:8000

(补充:这里以指定本地 8000 端口启动 Django 服务为例)

步骤七:测试 Django 多链接

打开浏览器输入以下网址:

(1)127.0.0.1:8000/page1
(2)127.0.0.1:8000/page2

[内容] Nginx 端口转发的设置

注意:

在设置 Nginx 重定向之前要先安装 Nginx

正文:

# vi /usr/local/nginx/conf/nginx.conf

将部分内容修改如下:

......
http {
.....
server {
listen 80 default_server;
listen [::]:80 default_server;
server_name  172.16.0.228;
......
location / {
proxy_pass http://127.0.0.1:8000;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
......
}
......
}


补充:这里以
1) 将 server_name 设置为 172.16.0.228
2) 监听 80 端口
3) 将 8000 端口转发到 80 端口为例

[内容] Linux SSL 证书的生成 (OpenSSL 版)

内容一:SSL 证书简介

1.1 SSL 证书包含的文件

KEY 私钥、CRT 公钥、PFX 公私钥、CSR 证书签名请求文件

1.2 SSL 证书包含的文件简介

1.2.1 KEY 私钥

KEY 私钥,放置在服务器上,属于机密文件,不能被其他人得到。可以是 PEM 或 DER 两种编码方式中的一种,这两种编码方式也可以相互转换。Linux 上通常使用 PEM,而 Windows 上通常使用 DER

1.2.2 CRT 公钥

CRT 公钥,放置在服务器上,可以被其它人得到。可以是 PEM 或 DER 两种编码方式中的一种,这两种编码方式也可以相互转换。Linux 上通常使用 PEM,而 Windows 上通常使用 DER

1.2.3 PFX 公私钥

PFX 同时包含公钥和私钥,放置在服务器上。在 Linux 上通常会分别使用 KEY 和 CRT 两个文件,而 Windows 会使用同时包含公钥和私钥的 PFX 文件

1.2.4 CSR 证书签名请求文件

CSR 全名 Certificate Signing Request,即证书签名请求文件。用于提供给证书供应商申请证书

内容二:生成 SSL 证书

2.1 生成 KEY 私钥

2.1.1 同时生成 KEY 私钥和 CSR 证书签名请求文件
2.1.1.1 交互式同时生成 KEY 私钥和 CSR 证书签名请求文件
# openssl req -nodes -newkey rsa:4096 -sha512 -keyout eternalcenter.com.key -out eternalcenter.com.csr

(补充:这里以同时生成长度 4096 位,加密格式为 512 的 KEY 私钥 eternalcenter.com.key 和 CSR 证书签名请求文件 eternalcenter.com.csr 为例)

(注意:后面还有国家、州或省、城市、组织、部门、域名和邮箱地址的信息需要输入此命令后手动填写)

2.1.1.2 非交互式同时生成 KEY 私钥和 CSR 证书签名请求文件
# openssl req -nodes -newkey rsa:4096 -sha512 -out eternalcenter.com.csr -keyout eternalcenter.com.key -subj "/C=CN/ST=Sichuan/L=Chengdu/O=Eternal Center/OU=Mingyu Zhu/CN=eternalcenter.com/emailAddress=contact@mingyuzhu.com"


补充:这里以同时生成
1) 长度为 4096 位
2) 加密格式为 512
3) 国家为 CN
4) 州或省为 Sichuan
5) 城市为 Chengdu
6) 组织为 Eternal Center
7) 部门为 Mingyu Zhu
8) 域名为 eternalcenter.com
9) 邮箱地址为 contact@mingyuzhu.com
的 KEY 私钥 eternalcenter.com.key 和 CSR 证书签名请求文件 eternalcenter.com.csr 为例

2.1.2 只生成 CSR 证书签名请求文件和 KEY 私钥
2.1.2.1 交互式只生成 CSR 证书签名请求文件和 KEY 私钥
# openssl req -nodes -newkey rsa:4096 -sha512 -keyout eternalcenter.com.key

(补充:这里以同时生成长度 4096 位,加密格式为 512 的 KEY 私钥 eternalcenter.com.key 和 CSR 证书签名请求文件 eternalcenter.com.csr 为例)

(注意:后面还有国家、州或省、城市、组织、部门、域名和邮箱地址的信息需要输入此命令后手动填写)

2.1.2.2 非交互式只生成 CSR 证书签名请求文件和 KEY 私钥
# openssl req -nodes -newkey rsa:4096 -sha512 -keyout eternalcenter.com.key -subj "/C=CN/ST=Sichuan/L=Chengdu/O=Eternal Center/OU=Mingyu Zhu/CN=eternalcenter.com/emailAddress=contact@mingyuzhu.com"


补充:这里以同时生成
1) 长度为 4096 位
2) 加密格式为 512
3) 国家为 CN
4) 州或省为 Sichuan
5) 城市为 Chengdu
6) 组织为 Eternal Center
7) 部门为 Mingyu Zhu
8) 域名为 eternalcenter.com
9) 邮箱地址为 contact@mingyuzhu.com
的 KEY 私钥 eternalcenter.com.key 和 CSR 证书签名请求文件 eternalcenter.com.csr 为例

2.2 生成 CRT 公钥

# openssl rsa -in eternalcenter.com.key -out eternalcenter.com.crt -pubout -outform PEM

(补充:这里以使用 KEY 私钥 eternalcenter.com.key 生成 CRT 公钥 eternalcenter.com.crt 为例)

内容三:查看 SSL 证书

3.1 查看 KEY 私钥

# cat eternalcenter.com.key

(补充:这里以查看 KEY 私钥 eternalcenter.com.key 为例)

3.2 查看 CRT 公钥

# cat eternalcenter.com.crt

(补充:这里以查看 CRT 公钥 eternalcenter.com.crt 为例)

3.3 查看 CSR 证书签名请求文件

# openssl req -in eternalcenter.com.csr -noout -text

(补充:这里以查看 CSR 证书签名请求文件 eternalcenter.com.csr 为例)

[内容] Linux 内存机制

正文:

内容一:Linux 显示内存的命令

# free

或者:

# top

内容二:Linux 内存各项指标和机制

2.1 top 命令显示的 Linux 内存各项指标和机制 (虚拟内存和物理内存之间的机制)

1) VIRT 虚拟内存使用的大小,应用申请的内存量
2) RES 物理内存使用的大小,虚拟内存映射到物理内存的内存量,也就是真实占用的内存量
3) %MEM 物理内存占用总内存的百分比,也就是真实占用的内存比


补充:
输入 top 命令以后,在显示的指标中, VIRT 是指虚拟内存占用率,RES 是指物理内存占用率。
应用使用内存时第 1 步会先申请虚拟内存。在拥有了虚拟机内存以后,只有当需要的时候才会将虚拟内存应用到物理内存。而只有当物理内存被应用了以后才会被消耗。
虚拟内存包含所有的代码、数据和已经被换出去的共享库加号页。虚拟内存同时也包含被分配但是还没有被使用的页,处于此状态的页映射到了内核的 “Zero Page” 所以其不会消耗任何内存。
真实内存占用率应该是检查物理内存的占用率。

2.2 free 命令显示的 Linux 内存各项指标和机制 (物理内存中 free 指标、buffers 指标、cached 指标和 available 指标之间的机制)

1) total 内存的总大小
2) used 正在被使用的内存大小
3) free 表示完全没有被使用的物理内存大小
4) shared 正在被多个进程共享的内存大小
5) buffers 被内核用作块缓冲区 (buffers) 的大小。这些数据暂时存储在内存中,用于提升系统性能,当再次使用时可以在内存中被快速调用。buffers (buffer page) 代表块设备 (硬盘等设备) 所占用的缓存页,对应从硬盘中直接获取的数据,处于内存和硬盘之间,由内核使用 (当 free 状态的内存不够时,它的部分空间会自动释放出来,我们也可以手动释放出它的部分空间来)
6) cached 被内核用作文件系统缓存 (cache) 的大小。这些数据暂时存储在内存中,用于提升系统性能,当再次使用时可以在内存中被快速调用。cached (cache page) 代表普通文件数据 (硬盘里的数据) 所占用的缓存页,对应 vfs 页缓冲层的数据,处于内存和 CPU (处理器) 之间,由应用程序使用 (当 free 状态的内存不够时,它的部分空间会自动释放出来,我们也可以手动释放出它的部分空间来)
7) available = free + buffers (部分空间) + cached (部分空间),也就是估算出来的真实的内存可使用量


补充:释放处于 buffers 和 cached 状态内存的方法

1) 释放 page cache:

# echo 1 > /proc/sys/vm/drop_caches

2) 释放 dentries 和 inodes:

# echo 2 > /proc/sys/vm/drop_caches

3) 同时释放 pagecache、dentries 和 inodes:

# echo 3 > /proc/sys/vm/drop_caches

2.3 free 命令的 Mem 行和 Swap 行的机制 (物理内存和 Swap 内存 (交换内存) 之间的机制)

2.3.1 Linux 内存的种类

1) Linux 物理内存:系统的真实内存,速度快 (也就是 free 命令中显示的第 1 行)
2) Linux Swap 内存 (交换内存):使用硬盘作为临时的内存的空间,速度慢 (也就是 free 命令中显示的第 2 行)

2.3.2 Swap 内存 (交换内存) 被使用的条件

1) Linux 内核会周期性把内存中不常调用的匿名页和共享内存交换至 Swap 内存 (交换内存) 里。即使现在 Linux 系统的物理内存有剩余空间
2) 当系统的内存不足时,系统会把匿名页和共享内存交换至 Swap 内存 (交换内存) 里

内容四:查看那些内存可以交换至 Swap 内存 (交换内存) 以及哪些内存可以被释放

# cat /proc/meminfo 
MemTotal:       65185544 kB
MemFree:        42285372 kB
MemAvailable:   57893528 kB
Buffers:            1656 kB
Cached:         16157600 kB
SwapCached:            0 kB
Active:          4505604 kB
Inactive:       17856228 kB
Active(anon):    1859740 kB
Inactive(anon):  4353236 kB
Active(file):    2645864 kB
Inactive(file): 13502992 kB
Unevictable:          16 kB
Mlocked:              16 kB
SwapTotal:             0 kB
SwapFree:              0 kB
Zswap:                 0 kB
Zswapped:              0 kB
Dirty:                 0 kB
Writeback:             0 kB
AnonPages:       6190160 kB
Mapped:           130544 kB
Shmem:             10400 kB
KReclaimable:     100636 kB
Slab:             234788 kB
SReclaimable:     100636 kB
SUnreclaim:       134152 kB
KernelStack:        8096 kB
PageTables:        26504 kB
SecPageTables:       696 kB
NFS_Unstable:          0 kB
Bounce:                0 kB
WritebackTmp:          0 kB
CommitLimit:    32592772 kB
Committed_AS:   13920568 kB
VmallocTotal:   34359738367 kB
VmallocUsed:       58476 kB
VmallocChunk:          0 kB
Percpu:            14464 kB
HardwareCorrupted:     0 kB
AnonHugePages:   5797888 kB
ShmemHugePages:        0 kB
ShmemPmdMapped:        0 kB
FileHugePages:         0 kB
FilePmdMapped:         0 kB
CmaTotal:              0 kB
CmaFree:               0 kB
Unaccepted:            0 kB
HugePages_Total:       0
HugePages_Free:        0
HugePages_Rsvd:        0
HugePages_Surp:        0
Hugepagesize:       2048 kB
Hugetlb:               0 kB
DirectMap4k:      284800 kB
DirectMap2M:    14784512 kB
DirectMap1G:    51380224 kB


补充:
1) Active(anon) 经常被使用的内存
2) Inactive(anon) 没有被经常使用的内存,也是 Linux 系统可以从物理内存交换至交换分区里的内存
3) Active(file) 经常被使用的页缓存内存
4) Inactive(file) 没有被经常使用的页缓存内存,也是 buffers/cached 中可以被系统回收的内存

参考文献:

https://access.redhat.com/solutions/296313