1. 程式人生 > >Django實戰總結 - 快速開發一個數據庫查詢服務

Django實戰總結 - 快速開發一個數據庫查詢服務

一、簡介 

 Django 是一個開放原始碼的 Web 應用框架,由 Python 寫成。

 Django 只要很少的程式碼就可以輕鬆地完成一個正式網站所需要的大部分內容,並進一步開發出全功能的 Web 服務。

 Django 本身基於 MVC 模型,同時也是一個MTV模型 。Django的MTV 模式本質上和 MVC 是一樣的,都是為了各元件間保持鬆耦合關係,只是定義上有些許不同。

MVC分別是指:

模型(Model)- 編寫程式應有的功能,負責業務物件與資料庫的對映(ORM)。

檢視(View)- 圖形介面,負責與使用者的互動(頁面)。

控制器(Controller)- 負責轉發請求,對請求進行處理。

MTV 分別是指:

模型(Model)- 編寫程式應有的功能,負責業務物件與資料庫的對映(ORM)。

模板 (Template) - 負責如何把頁面(html)展示給使用者。

檢視(View)- 負責業務邏輯,並在適當時候呼叫 Model和 Template。

 

 


二、安裝

 首先要安裝Python,配置好環境變數,當然這裡我使用Python3,不再多說。

 然後我們利用pip工具進行Django的安裝(這裡為了下載更快指定清華映象源),最後使用 django-admin 命令檢查是否安裝成功。

E:\__TEST__>pip install Django -i https://pypi.tuna.tsinghua.edu.cn/simple
......
......
E:\__TEST__>django-admin
Type 'django-admin help <subcommand>' for help on a specific subcommand. Available subcommands: [django] check compilemessages createcachetable ......

 


三、初始化

 首先使用 django-admin startproject testDjango 命令初始化一個測試專案。

E:\__TEST__>django-admin.py startproject testDjango

E:\__TEST__>dir /b
testDjango

E:\__TEST__>cd testDjango

E:\__TEST__\testDjango>tree /f
資料夾 PATH 列表
卷序列號為 B2C1-63D6
E:.
│ manage.py
│
└─testDjango
asgi.py
settings.py
urls.py
wsgi.py
__init__.py
目錄說明:

testDjango: 專案的容器。

manage.py: 一個實用的命令列工具,可讓你以各種方式與該 Django 專案進行互動。
testDjango/__init__.py: 一個空檔案,告訴 Python 該目錄是一個 Python 包。
testDjango/asgi.py: 一個 ASGI(Asynchronous Server Gateway Interface) 相容的 Web 伺服器的入口,以便執行你的專案。
testDjango/settings.py: 該 Django 專案的設定/配置。
testDjango/urls.py: 該 Django 專案的 URL 宣告; 一份由 Django 驅動的網站"目錄"。
testDjango/wsgi.py: 一個 WSGI(Web Server Gateway Interface) 相容的 Web 伺服器的入口,以便執行你的專案。

 

然後使用 python manage.py runserver 0.0.0.0:8000 命令嘗試啟動服務。

E:\__TEST__\testDjango>python manage.py runserver 0.0.0.0:8000
Watching for file changes with StatReloader
Performing system checks...

System check identified no issues (0 silenced).

You have 18 unapplied migration(s). Your project may not work properly until yo
 apply the migrations for app(s): admin, auth, contenttypes, sessions.
Run 'python manage.py migrate' to apply them.
November 20, 2020 - 15:15:29
Django version 3.1.3, using settings 'testDjango.settings'
Starting development server at http://0.0.0.0:8000/
Quit the server with CTRL-BREAK.

 

最後我們就可以使用 127.0.0.1:8000 開啟瀏覽器訪問了 。

 


四、小試牛刀

 在測試專案根目錄,新建 index.html 檔案,用於編寫圖形頁面,程式碼如下:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    <p>{{name}}</p>
</body>
</html>

 

 在測試專案子目錄,新建views.py檔案,用於與頁面的互動,程式碼如下:

from django.shortcuts import render


def main(request):
    context = {"name": "小試牛刀"}
    return render(request, "index.html", context)

 

最終目錄結構如下:

E:\__TEST__\testDjango>tree /f
資料夾 PATH 列表
卷序列號為 B2C1-63D6
E:.
│  db.sqlite3
│  manage.py
│  index.html
└─testDjango
        asgi.py
        views.py
        settings.py
        urls.py
        wsgi.py
        __init__.py

 

接下來我們需要向Django說明檢視檔案的路徑,開啟settings.py檔案,修改 TEMPLATES 中的 DIRS 值。

TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [BASE_DIR],
        'APP_DIRS': True,
        'OPTIONS': {
            'context_processors': [
                'django.template.context_processors.debug',
                'django.template.context_processors.request',
                'django.contrib.auth.context_processors.auth',
                'django.contrib.messages.context_processors.messages',
            ],
        },
    },
]

 

然後繫結URL與檢視函式,開啟urls.py檔案,匯入url模組和views檢視,並修改urlpatterns值。

from django.conf.urls import url
from . import views

urlpatterns = [
    url(r'^$', views.main)

 

啟動服務開啟瀏覽器,效果如下:

 


五、進階表單

HTML表單是網站互動性的經典方式,接下來我們將利用Django進行提交表單操作。

首先在靜態頁面新增一個form表單,並且使用get方法,然後新增一個輸入框和一個提交按鈕。

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Title</title>
</head>
<body>
    <form action="/search" method="get">
        <input type="text" name="q">
        <input type="submit" value="查詢">
    </form>
</body>
</html>

 

接下來編寫互動操作,匯入HttpResponse請求響應模組,新增搜尋方法用於返回請求內容。

from django.http import HttpResponse
from django.shortcuts import render


def main(request):
    return render(request, "index.html")


def search(request):
    request.encoding = 'utf-8'
    query = request.GET['q']

    if query:
        message = '查詢內容為: ' + query
    else:
        message = '查詢內容為空!'

    return HttpResponse(message)

 

然後繫結URL與檢視函式,開啟urls.py檔案,修改url規則。

from django.conf.urls import url
from . import views

urlpatterns = [
    url(r'^$', views.main),
    url(r'^search$', views.search)

 

啟動服務開啟瀏覽器,效果如下:

 >>> 

 


六、開發一個數據查詢服務

1、服務需求分析

現有一個大資料專案,根據業務資料型別需要,會把資料儲存到不同型別的資料庫,這裡包括常用的關係資料庫MySQL,還有記憶體庫Redis(其中根據業務需要分成兩個庫),以及文件資料庫ElasticSearch。

功能要求:  a. 支援這三種資料庫的查詢    b. 支援基本表的選擇    c. 一個良好的輸出展示

 

1、前端靜態頁面

根據服務需求,我們先進行靜態頁面的開發,修改index.html內容,程式碼如下:

我們使用 radio 標籤進行不同資料庫的選擇,使用 select 標籤進行不同表的選擇,

然後新增一個 text 輸入框和一個 submit 提交按鈕,再新增一個 textarea 標籤用於結果的展示,最後進行樣式美化。

注意:這裡我們使用的post請求,必須新增 {% csrf_token %} 標籤。csrf 全稱是 Cross Site Request Forgery,這是Django提供的防止偽裝提交請求的功能。

 

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>育苗通資料查詢</title>
</head>
<body style="display:flex;justify-content:center;">
    <form action="/search" method="post">
        <br>
        {% csrf_token %}
        <input type="radio" name="db_type" value="mysql" checked>MySQL

        <input type="radio" name="db_type" value="redis_gen">Redis_Gen
        <select name="redis_db_gen" style="height:25px;">
          <option value ="0">[0] 微信繫結過程臨時存放庫</option>
          <option value ="2">[2] 登入使用者token庫</option>
          <option value ="3">[3] 疫苗分組記憶體庫</option>
        </select>&nbsp;

        <input type="radio" name="db_type" value="redis_cit">Redis_Cit
        <select name="redis_db_cit" style="height:25px;">
          <option value ="0">[0] 兒童基本資訊庫</option>
          <option value ="1">[1] 兒童接種通知庫</option>
          <option value ="2">[2] 兒童接種告知庫</option>
          <option value ="3">[3] 兒童免疫史資訊庫</option>
        </select>&nbsp;

        <input type="radio" name="db_type" value="es" >ElasticSearch
        <select name="es_table" style="height:25px;">
          <option value ="child">兒童表</option>
          <option value ="td_app_wxin_regist">微信登錄檔</option>
        </select>&nbsp;
        <br>
        <br>
        <input type="text" name="query" style="height:30px;width:500px">
        &nbsp;&nbsp;
        <input type="submit" value="查 詢 數 據 庫" style="height:33px;width:150px;font-weight:700">
        <br>
        <br>
        <textarea name="comment" rows="50" cols="125">{{result}}</textarea>
    </form>
</body>
</html>

 

 2、後端請求處理

前端頁面開發完成,我們需要對相應請求做處理,修改views.py內容,程式碼如下:

首先預設頁面,然後請求結果頁面(這裡呼叫到的資料庫查詢方法tools.py檔案不做展示),最後進行結果輸出優化。

from django.shortcuts import render
from . import tools as t


def main(request):
    return render(request, "index.html")


def search(request):
    request.encoding = 'utf-8'
    query = request.POST['query']
    db_type = request.POST['db_type']

    # 判斷資料庫型別
    if query:
        if db_type == 'redis_gen':
            db = request.POST['redis_db_gen']
            result = t.get_redis_data_gen(query, db)
        elif db_type == 'redis_cit':
            db = request.POST['redis_db_cit']
            result = t.get_redis_data_cit(query, db)
        elif db_type == 'es':
            table = request.POST['es_table']
            result = t.get_es_data(query, table)
        else:
            result = t.get_mysql_data(query)
    else:
        result = ''

    # 格式化輸出結果
    print_result = ''
    if isinstance(result, list):
        for each in result:
            if isinstance(each, dict):
                print_result += '=' * 100 + '\n\n'
                for key, value in each.items():
                    print_result += ' ' + key + ' : ' + str(value) + '\n\n'
            else:
                print_result += ' ' + str(each) + '\n\n'
    elif isinstance(result, dict):
        for key, value in result.items():
            print_result += ' ' + key + ' : ' + str(value) + '\n\n'
    else:
        print_result = result

    return render(request, "index.html", {'result': print_result})

 

如果你需要把服務共享給區域網內其他人員使用,開啟settings.py檔案,把你的IP新增到 ALLOWED_HOSTS 中即可。

ALLOWED_HOSTS = ['10.20.30.28']

 

3、最終效果展示

 

 

學習課程參考:https://www.runoob.com/django/django-tutorial.html

 

  

  作者:Leozhanggg

  出處:https://www.cnblogs.com/leozhanggg/p/14005286.html

  本文版權歸作者和部落格園共有,歡迎轉載,但未經作者同意必須保留此段宣告,且在文章頁面明顯位置給出原文連線,否則保留追究法律責任的權利。

 

&n