注意:
文中的 python 系统名、mysite 项目、users 应用和 user 类只是站主在本次操作中随意取的名称,读者可以根据自己的喜好换成任意别的名称
正文:
步骤一:系统环境要求
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.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 服务器的入口
步骤四:创建 users 应用
4.1 创建 users 应用
(django_env) [root@python mysite]# django-admin startapp users
4.2 users 应用的目录
4.2.1 显示 users 应用的目录
(django_env) [root@python mysite]# tree
.
├── manage.py
├── mysite
│   ├── __init__.py
│   ├── asgi.py
│   ├── settings.py
│   ├── urls.py
│   └── wsgi.py
└── users
    ├── __init__.py
    ├── admin.py
    ├── apps.py
    ├── migrations
    │   └── __init__.py
    ├── models.py
    ├── tests.py
    └── views.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 应用的视图,接收前端数据,把数据传递给后端,响应相关页面
步骤五:实现 users 应用的层级多链接
5.1 在 mysite 应用中添加 1 个链接并链接 users 的链接
创建 mysite/users/urls.py 并添加以下内容:
#coding=utf-8
from django.conf.urls import url, include
from users.views import register
urlpatterns = [
    url(r'^users/', include('users.urls')),
]
5.2 在 mysite 应用中导入 users 应用
在 mysite/mysite/settings.py 中添加以下内容:
......
INSTALLED_APPS = [
......
    'users',
]
......
步骤六:实现连接 MariaDB 数据库
6.1 安装 MairaDB 数据库和客户端
(django_env) [root@python mysite]# zypper -n install mariadb mariadb-devel mariadb-server mariadb-client
6.2 安装 Django 连接 MariaDB 的模块
(django_env) [root@python mysite]# pip3 install hexdump
(django_env) [root@python mysite]# pip3 install pymysql
6.3 在 mysite 应用中添加 Django 连接 MariaDB 的模块
在 mysite/mysite/__init__.py 中添加以下内容:
import pymysql
pymysql.install_as_MySQLdb()
6.4 创建用于 Django 的 MairaDB 的库和用户
6.4.1 进入 MairaDB 数据库
(django_env) [root@python mysite]# mysql -h 127.0.0.1 -p
6.4.2 创建用于 Django 的库
MariaDB [(none)]> create database test;
(补充:这里以创建 test 库为例)
6.4.3 创建用于 Django 的用户
MariaDB [(none)]> GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY 'password' WITH GRANT OPTION;
(补充:这里以创建 root 用户,密码是 password 为例)
6.4.4 退出 MariaDB 数据库
MariaDB [(none)]> exit
6.4.5 重启 MariaDB
(django_env) [root@python mysite]# systemctl restart mariadb
6.5 在 users 应用数据库模板中添加 user 类
在 mysite/users/models.py 中添加以下内容:
......
class user(models.Model):
    tname = models.CharField(max_length=30,unique=True)
    tpassword = models.CharField(max_length=30)
(
补充:
1) 这里以创建 tname 和 tpassword 两个字符,长度为 30 个字节,其中 1 个为唯一为例
2) 主键可以不用设置,默认会自动生成 1 个 ID 主键
3) 默认表名会生成 <应用名>_<模型类名>,在这里就是 users_user
4) 指定要生成的表明的设置方法是:
    class Meta:
        db_table = '<table>'
)
6.6 在 mysite 应用中设置连接到 MariaDB 数据库
将 mysite/mysite/settings.py 中的以下内容:
......
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.sqlite3',
        'NAME': BASE_DIR / 'db.sqlite3',
    }
}
......
修改为:
......
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'test',
        'HOST': '127.0.0.1',
        'PORT': '3306',
        'USER': 'root',
        'PASSWORD': 'password',
    }
}
......
(
补充:这里以
1) 使用的库是 test
2) 使用的服务器是 127.0.0.1
3) 使用的端口是 3306
4) 使用的用户是 root
5) 使用的密码是 password
为例
)
6.7 生成牵引文件
(django_env) [root@python mysite]# python3 manage.py makemigrations
Migrations for 'users':
  users/migrations/0001_initial.py
    - Create model user
(补充:这里以将 users 应用的 model 模块转换成牵引文件为例)
6.8 将牵引文件导入 MariaDB 数据库
(django_env) [root@python mysite]# python3 manage.py migrate
Operations to perform:
  Apply all migrations: admin, auth, contenttypes, sessions, users
Running migrations:
  Applying contenttypes.0001_initial... OK
  Applying auth.0001_initial... OK
  Applying admin.0001_initial... OK
  Applying admin.0002_logentry_remove_auto_add... OK
  Applying admin.0003_logentry_add_action_flag_choices... OK
  Applying contenttypes.0002_remove_content_type_name... OK
  Applying auth.0002_alter_permission_name_max_length... OK
  Applying auth.0003_alter_user_email_max_length... OK
  Applying auth.0004_alter_user_username_opts... OK
  Applying auth.0005_alter_user_last_login_null... OK
  Applying auth.0006_require_contenttypes_0002... OK
  Applying auth.0007_alter_validators_add_error_messages... OK
  Applying auth.0008_alter_user_username_max_length... OK
  Applying auth.0009_alter_user_last_name_max_length... OK
  Applying auth.0010_alter_group_name_max_length... OK
  Applying auth.0011_update_proxy_permissions... OK
  Applying auth.0012_alter_user_first_name_max_length... OK
  Applying sessions.0001_initial... OK
  Applying users.0001_initial... OK
6.9 查看导入到 MariaDB 数据库的表
6.9.1 进入 MariaDB 数据库
# mysql -uroot -h172.16.0.7 -p
6.9.2 查看所有的库
> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| test               |
+--------------------+
6.9.3 进入 test 库
> use test;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A
6.9.4 查看 test 库里所有的表
> show tables;
+----------------------------+
| Tables_in_test             |
+----------------------------+
| auth_group                 |
| auth_group_permissions     |
| auth_permission            |
| auth_user                  |
| auth_user_groups           |
| auth_user_user_permissions |
| django_admin_log           |
| django_content_type        |
| django_migrations          |
| django_session             |
| users_user                 |
+----------------------------+
11 rows in set (0.001 sec)
6.9.5 查看 users_user 表里的数据
> select * from users_user;
Empty set (0.001 sec)
6.9.6 查看 users_user 的表结构
> desc users_user;
+-----------+-------------+------+-----+---------+----------------+
| Field     | Type        | Null | Key | Default | Extra          |
+-----------+-------------+------+-----+---------+----------------+
| id        | bigint(20)  | NO   | PRI | NULL    | auto_increment |
| tname     | varchar(30) | NO   | UNI | NULL    |                |
| tpassword | varchar(30) | NO   |     | NULL    |                |
+-----------+-------------+------+-----+---------+----------------+
3 rows in set (0.003 sec)
6.9.7 退出 MariaDB 数据库
> quit;
步骤七:实现注册功能
7.1 在 users 应用中添加 1 个注册功能的 HTML 模板
创建 mysite/users/templates/users/register.html 并添加以下内容:
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>register</title>
</head>
<body>
    <form action="/users/register/" method="post">
        {% csrf_token %}
        <p>
            <label for="un">User: </label><input type="text" name="uname" id="un"/>
        </p>
        <p>
            <label for="up">Password: </label><input type="password" name="upassword" id="up"/>
        </p>
        <input type="submit" value="register"/>
    </form>
</body>
</html>
(
补充:这里以
1) 生成 1 个用户名输入栏,赋值给 uname
2) 生成 1 个密码输入栏,赋值给 upassword
3) 生成 1 个 register 提交按钮
为例
)
7.2 在 users 应用中添加 1 个网页返回值的模块并将符合的数值插入数据库
将 mysite/users/views.py 里的内容全部修改如下:
from django.shortcuts import render
from django.shortcuts import HttpResponse
from .models import user
# Create your views here.
def register(request):
    if request.method=="GET":
        return render(request,'users/register.html')
    else:
        uname = request.POST.get('uname','')
        upassword = request.POST.get('upassword','')
        if uname.strip()!='' and upassword.strip()!='':
        # determine whether uname and upassword are null values
            nuser = user(tname=uname,tpassword=upassword)
            nuser.save()
            return HttpResponse('success!')
        else:
            return HttpResponse('fail')
    return HttpResponse('fail')
(
补充:这里以
1) 设置 register 模块并返回 users/register.html
2) 设置 register 模块当网页返回模式是 POST 且 uname 和 upassword 都为非空时将数据存入数据库
为例
)
7.3 在 users 应用中添加 1 个链接并设置对应的模块
创建 mysite/users/urls.py 并添加以下内容:
#coding=utf-8
from django.conf.urls import url
from users.views import register
urlpatterns = [
    url(r'^register', register),
]
(补充:这里以设置 register 链接对应 register 模块为例)
步骤八:实现展示功能
8.1 在 users 应用中添加 1 个展示数据功能的 HTML 模板
创建 mysite/users/templates/users/show.html 并添加以下内容:
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>show</title>
</head>
<body>
    <table border="1" cellspacing="0" width="500px">
        <tr>
            <th>Num</th>
            <th>ID</th>
            <th>Name</th>
            <th>Password</th>
        </tr>
        {% for oneuser in userlist %}
            <tr>
                <td>{{ forloop.counter }}</td>
                <td>{{ oneuser.id }}</td>
                <td>{{ oneuser.tname }}</td>
                <td>{{ oneuser.tpassword }}</td>
            </tr>
        {% endfor %}
    </table>    
</body>
</html>
(
补充:
1) 这里以生成 1 个表格,并将数据循环写入进去为例
2) 这里的 {% for oneuser in userlist %}……{% endfor %} 是指以 userlist 变量里的数据进行循环
3) 这里的 forloop.counter 变量在这里的作用是正向计数,也可以使用revcounter0 进行逆向计数
)
8.2 在 users 应用中添加 1 个网页返回值的模块并从数据库里读取全部数据
在 mysite/users/views.py 中添加以下内容:
......
def show(request):
    ruser = user.objects.all()
    return render(request,'users/show.html',{'userlist':ruser})
(
补充:这里以
1) 设置 ruser 模块并返回 users/show.html
2) 这里的 ruser = user.objects.all() 是指将 user 模块对应数据库里的所有数据导入给 ruser 变量
3) 这里的 {‘userlist’:ruser} 是指给 users/show.html 一个 user list 变量,并将现在的 ruser 值赋予即将给予 users/show.html 的 ruser 变量
为例
)
8.3 在 users 应用中添加 1 个链接并设置对应的模块
在 mysite/users/urls.py 中添加以下内容:
......
from users.views import show
urlpatterns = [
......
    url(r'^show', show),
]
(补充:这里以设置 show 链接对应 show 模块为例)
步骤九:实现登录功能
9.1 在 users 应用中添加 1 个登录功能的 html 模板
创建 mysite/users/templates/users/login.html 并添加以下内容:
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>register</title>
</head>
<body>
    <form action="/users/login/" method="post">
        {% csrf_token %}
        <p>
            <label for="un">User: </label><input type="text" name="uname" id="un"/>
        </p>
        <p>
            <label for="up">Password: </label><input type="password" name="upassword" id="up"/>
        </p>
        <input type="submit" value="login"/>
    </form>
</body>
</html>
(
补充:这里以
1) 生成 1 个用户名输入栏,赋值给 uname
2) 生成 1 个密码输入栏,赋值给 upassword
3) 生成 1 个 login 提交按钮
为例
)
9.2 在 users 应用中添加 1 个网页返回值的模块并从数据库里比对数据
在 mysite/users/views.py 中添加以下内容:
......
def login(request):
    if request.method=='GET':
        return render(request,'users/login.html')
    else:
        loginname = request.POST.get('uname')
        loginpassword = request.POST.get('upassword')
        if loginname and loginpassword:
            c = user.objects.filter(tname=loginname,tpassword=loginpassword).count()
            if c == 1:
                return HttpResponse('Login Success !')
    return HttpResponse('Login Fail !')
(
补充:这里以
1) 设置 login 模块并返回 users/login.html
2) 从 users/register.html 中获取 uname 和 upassword 值
3) 设置 login 模块当网页返回模式是 POST 且 uname 和 upassword 与数据库中对应的值一样时则返回 ‘Login Success !’ 值,否则返回 ‘Login Fail !’ 值
为例
4) 这里 c = user.objects.filter(tname=loginname,tpassword=loginpassword).count() 中逗号 “,” 是 and 的意思
)
9.3 在 users 应用中添加 1 个链接并设置对应的模块
在 mysite/users/urls.py 中添加以下内容:
......
from users.views import login
urlpatterns = [
......
    url(r'^login/$', login),
]
(补充:这里以设置 login 链接对应 login 模块为例)
步骤十:启动 Django 服务
(django_env) [root@python mysite]# python3 manage.py runserver
步骤十一:测试注册功能
1) 打开浏览器输入以下网址:
http://127.0.0.1:8000/users/register/
2) 当用户名输入 eternalcenter,密码输入密码 1 点击 “register” 时,返回 successful
步骤十二:测试展示功能
1) 打开浏览器输入以下网址:
http://127.0.0.1:8000/users/show/
2) 可以看到以下信息:
1 eternalcenter 1
步骤十三:测试登录功能
1) 打开浏览器输入以下网址:
http://127.0.0.1:8000/users/login/
2) 当用户名输入 eternalcenter,密码输入密码 1 点击 “login” 时,返回 Login Success !
