[实验] 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 -m

内容二:Linux 内存机制

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

内容三: Linux Swap 内存的使用机制

3.1 Linux 内存的种类

1) Linux 物理内存:系统的真实内存,速度快 (也就是 free 命令中显示的第 1 行)
2) Linux Swap 内存:使用硬盘作为临时的内存的空间,速度慢 (也就是 free 命令中显示的第 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 中可以被系统回收的内存