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

1、簡介 

 Django 是一個開放源代碼的 Web 應用框架,由 Python 寫成。html

 Django 只要不多的代碼就能夠輕鬆地完成一個正式網站所須要的大部份內容,並進一步開發出全功能的 Web 服務。前端

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

MVC分別是指:mysql

模型(Model)- 編寫程序應有的功能,負責業務對象與數據庫的映射(ORM)。redis

視圖(View)- 圖形界面,負責與用戶的交互(頁面)。sql

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

MTV 分別是指:django

模型(Model)- 編寫程序應有的功能,負責業務對象與數據庫的映射(ORM)。後端

模板 (Template) - 負責如何把頁面(html)展現給用戶。瀏覽器

視圖(View)- 負責業務邏輯,並在適當時候調用 Model和 Template。

 

 


2、安裝

 首先要安裝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 ......

 


3、初始化

 首先使用 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 打開瀏覽器訪問了 。

 


4、小試牛刀

 在測試項目根目錄,新建 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)

 

啓動服務打開瀏覽器,效果以下:

 


5、進階表單

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)

 

啓動服務打開瀏覽器,效果以下:

 >>> 

 


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

一、服務需求分析

現有一個大數據項目,根據業務數據類型須要,會把數據存儲到不一樣類型的數據庫,這裏包括經常使用的關係數據庫MySQL,還有內存庫Redis(其中根據業務須要分紅兩個庫),以及文檔數據庫ElasticSearch。

功能要求:  a. 支持這三種數據庫的查詢    b. 支持基本表的選擇    c. 一個良好的輸出展現

 

一、前端靜態頁面

根據服務需求,咱們先進行靜態頁面的開發,修改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>

 

 二、後端請求處理

前端頁面開發完成,咱們須要對相應請求作處理,修改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']

 

三、最終效果展現

 

 

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

 

  

  做者:Leozhanggg

  出處:http://www.javashuo.com/article/p-fnkpnjem-nv.html

  本文版權歸做者和博客園共有,歡迎轉載,但未經做者贊成必須保留此段聲明,且在文章頁面明顯位置給出原文鏈接,不然保留追究法律責任的權利。

相關文章
相關標籤/搜索