Django實戰總結 - 快速開發一個Web服務


一、簡介 

 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

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

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM