Day 05 - Django + MariaDB 在 Amazon Linux 2
每天的目的是要让 Django Web 应用程序可以读取 MariaDB 的资料,在前一篇我们新增了一个专案为fishsite,这个专案下的fishsite子文件夹是整个网站的进入点,下图有文件夹目录的内容:
- __init__.py: 是一个空文件,指示Python目录命名Python套件。
- __pycache__文件夹:当.py档案第一次被汇入时,它会被直译器视为位元组程序码,将位元组码写入同名的.pyc档案中,简单的可以并且是专门加了专门的文件,可以请求直接读取这个部分代码的方案名称相同,特效执行速度。
- settings.py:这是可以注册所有创建的应用的地方,也是网站文件,数据库配置的,等等。
- urls.py:定义了网站url到视图的映射。虽然这里可以看到所有的url,但更多的一些做法是把应用相关的url包含在应用程序中,你可以在后台的相关教程里看到。
- wsgi.py: 帮助 Django 应用和网络服务器间的通讯。你可以把这个当作模板。
- manage.py:可以创建应用(App),资料库通讯,启动网络服务器等。
图 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 以连接资料库
在上一篇 Day 03 - 安装资料库 MariaDB 在 Amazon Linux 2 中已经设定好资料库,所以需要在 settings.py 中建立资料库的连线设置
'default': {
'ENGINE': 'django.db.backends.mysql',#资料库引擎
'NAME': 'fishdb',#先前建立的资料库
'USER': 'fishuser', #资料库用户
'PASSWORD': 'xxxxxx',#敏密码口味的密码是去用的,请自行设定
'HOST': 'localhost', #资料库主机
'PORT': '3306',#资料库埠号
'OPTIONS': {
'sql_mode': 'STRICT_TRANS_TABLES',#当数据在插入时被截断时,该选项警告升级为错误。
}
}
图 2、在 settings.py 中资料库连线设置
完成资料库设定后,可以再运行一下启动 Django Web 伺服器的指令,以确保设定的参数是正确的,以及跟有的套件都已经齐全了,下图就是将资料库的用户名称设定为 fishuser1 ,从而导致拒绝访问的错误消息。可以按 CTRL+C 再中断执行Django Web 服务器的指令后,进行修改。
python3 manage.py runserver 0.0.0.0:8000
图 3、因资料库设置错误,导致启动 Django Web 服务器失败
设置urls.py
然后打开 urls.py 来画面(查看)的对应,我们的专案很简单,只有一个上传图片的需求,所以 URI 为 imgUpolad 对应到查看这个文件中你好你好设置的方法,在最后加入设置了下面的语法,结果如下图所示。
# 从当前目录中(.)汇入 view.py 这个档案
from . import view
# 对应当这个用户读取 imgUpolad 这个 URI 时会 (route) 到 view 这个档案中的 hello 这个方法
path('imgUpload/', view.hello),
图 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 个笔表中的资料,可以发现会是编码的显示方式,如下图所示。
图 5、通过浏览器调用 Django 的方法
下图是伺服器的响应状态,可以提供前端呼叫 imgUpload 的 HTTP 请求(request),以及成功的 200 代码响应(response)
图 6、伺服器的回复情况
参考资料
- __init__.py 作用詳解, https://codertw.com/程式語言/92993/
- What is __init__.py for?, https://stackoverflow.com/questions/448271/what-is-init-py-for
- Installing MySQL-python without mysql-server on CentOS, https://stackoverflow.com/questions/13922955/installing-mysql-python-without-mysql-server-on-centos
- Databases, https://docs.djangoproject.com/en/3.2/ref/databases/
- Performing raw SQL queries, https://docs.djangoproject.com/en/3.2/topics/db/sql/