Django + MariaDB 在 Amazon Linux 2-Day 05

Django + MariaDB 在 Amazon Linux 2-Day 05

今天的目的是要让 Django Web 应用程序可以读取 MariaDB 的资料,在前一篇我们新增了一个专案为 fishsite,这个专案下的 fishsite 子文件夹是整个网站的进入点,下图有文件夹目录的内容:

  • __init__.py: 是一个空文件,指示 Python 将此目录视为 Python 套件。
  • __pycache__文件夹:当 .py 档案第一次被汇入时,它会被直译器汇编为位元组程序码,并将位元组码写入同名的.pyc档案中,可以简单的看成是汇编後的文件,後续请求可以直接读取这一部分代码加专案名称相同,并且加快执行速度。
  • settings.py: 包含所有的网站设置。这是可以注册所有创建的应用的地方,也是静态文件,数据库配置的地方,等等。
  • urls.py: 定义了网站 url 到 view 的映射。虽然这里可以包含所有的 url,但是更常见的做法是把应用相关的url包含在相关应用中,你可以在接下来的教程里看到。
  • wsgi.py: 帮助 Django 应用和网络服务器间的通讯。你可以把这个当作模板。
  • manage.py: 可以创建应用(App),资料库通讯,启动网络服务器等。

https://ithelp.ithome.com.tw/upload/images/20210905/20129510KfjIdCbt5a.png
图 1、Django 专案的档案结构

Django 的一个专案下可以存在很多个应用(App),而当新增一个专案後会建立一个预设的应用,而这个预设的应用名称会跟专案名称相同。接下来的工作是

  • 安装 Python 的 MariaDB 套件
  • 设定 settings.py 以连接资料库
  • 设定 urls.py 定义网站 url 到画面 (view)的对应
  • 新增 view.py 读取资料库并回传结果

安装 Python 的 MariaDB 套件

在 Amazon Linux 2 内安装 mariadb-devel,接着在透过 pip3 安装 Python 所需要的套件 mysqlclient

sudo yum install mariadb-devel
pip3 install mysqlclient

设定 settings.py 以连接资料库

在上一篇 安装资料库 MariaDB 在 Amazon Linux 2-Day 03 中已经设定好资料库,所以需要在 settings.py 中建立资料库的连线设定

'default': {
        'ENGINE': 'django.db.backends.mysql',   # 资料库引擎
        'NAME': 'fishdb',  # 先前建立的资料库
        'USER': 'fishuser',     # 资料库使用者
        'PASSWORD': 'xxxxxx',  # 密码,左边的密码是去敏用的,请自行设定
        'HOST': 'localhost',  # 资料库所在主机
        'PORT': '3306',         # 资料库埠号
        'OPTIONS': {
            'sql_mode' : 'STRICT_TRANS_TABLES', #当数据在插入时被截断时,该选项会将警告升级为错误。
        }

https://ithelp.ithome.com.tw/upload/images/20210905/20129510TdfmZJFqoI.png
图 2、在 settings.py 中资料库连线设定

完成资料库设定後,可以再运行一下启动 Django Web 服务器的指令,以确保设定的参数是正确的,以及跟有的套件都已经完备,下图就是将资料库的使用者名称设定为 fishuser1 ,而导致存取拒绝的错误讯息。可以按下 CTRL+C 中断执行 Django Web 服务器的指令後,再进行修改。

python3 manage.py runserver 0.0.0.0:8000

https://ithelp.ithome.com.tw/upload/images/20210905/201295102qsK44lgT4.png
图 3、因资料库设定错误,导致启动 Django Web 服务器失败

设定 urls.py

接着打开 urls.py 来设定 URI 到画面 (view)的对应,我们的专案很简单,只有一个上传图片的需求,所以设定 URI 为 imgUpolad 对应到 view 这个文件中 hello 的方法,在最後一行加上下述语法,结果如下图所示。

# 从目前目录中(.)汇入 view.py 这个档案 
from . import view
# 指定当使用者读取 imgUpolad 这个URI时会对应 (route) 到 view 这个档案中的 hello 这个方法 
    path('imgUpload/', view.hello),

https://ithelp.ithome.com.tw/upload/images/20210905/20129510KMUpjUMwaZ.png
图 4、新增 URI 与画面的对应关系

新增 view.py

在 urls.py 这个档案相同的目录下,新增一个档案 view.py,内容如下,主要功能为读取资料库内容并回传结果。我们所采用的方法是直接用原始 SQL 语法读取资料表,而非用 Django 使用物件关系映射器(ORM),将 Django 代码中的模型 (model) 定义,会对应到底层的资料库使用的资料结构。主要是因为我们只有一个的资料表,所以直接用 Django 所实作的 connection 来传入所需的 SQL 语法。
型态简单

view.py

from django.http import JsonResponse
from django.db import transaction
from django.db import connection

def hello(request):
    with connection.cursor() as cursor:
        cursor.execute("select fishName,LatinName from fishInfoTbl")
        #row = cursor.fetchone()
        row = dictfetchall(cursor)
    return JsonResponse(row, safe=False)

def dictfetchall(cursor):
#    "Return all rows from a cursor as a dict"
        columns = [col[0] for col in cursor.description]
        return [
            dict(zip(columns, row))
            for row in cursor.fetchall()
        ]

在浏览器里输入 http:[EC2_IPv4]:8000/imgUpload/,[EC2_IPv4]指的是EC2的公有 IPv4 地址。就会出现 5 笔资料表中的资料,可以发现会是以编码的方式呈现,如下图所示。

https://ithelp.ithome.com.tw/upload/images/20210905/201295107JrjhLbVQE.png
图 5、透过浏览器呼叫 Django 的方法

下图是後端服务器的回应状况,可以看到前端呼叫 imgUpload 的 HTTP 请求(request),以及成功的 200 代码回应 (response)

https://ithelp.ithome.com.tw/upload/images/20210905/20129510RdQKVWBZi7.png

参考资料


<<:  【Day 5】VSCode移动GIT里的HEAD

>>:  【履历要点 ii】不要放这些在履历上

Day19_CSS语法2

再来要介绍连结HTML文件和CSS样式表的不同写法 在< head>元素里面使用<...

第 09 天 日积月累养成习惯( leetcode 413 416 )

https://leetcode.com/problems/arithmetic-slices/d...

Day-18 EditText

EditText为提供使用者输入之元件, 而其中包括许多属性提供不同之用途, 下面列举出EditTe...

day6 - proto buffer 简介 & spec 编写

每支API都要写文件的日子, 你还记得吗? API文件是让别人了解系统提供哪些功能的媒介, 文件要写...

Day 28 | AI & 深度学习的应用

剩下几天的时间,要再分享其它实作内容似乎有些困难,那麽大家轻松一点,今天就来谈谈我们所学这些技术的应...