加入星計(jì)劃,您可以享受以下權(quán)益:

  • 創(chuàng)作內(nèi)容快速變現(xiàn)
  • 行業(yè)影響力擴(kuò)散
  • 作品版權(quán)保護(hù)
  • 300W+ 專(zhuān)業(yè)用戶
  • 1.5W+ 優(yōu)質(zhì)創(chuàng)作者
  • 5000+ 長(zhǎng)期合作伙伴
立即加入
  • 正文
  • 相關(guān)推薦
  • 電子產(chǎn)業(yè)圖譜
申請(qǐng)入駐 產(chǎn)業(yè)圖譜

Django讓web開(kāi)發(fā)更簡(jiǎn)單(一):運(yùn)行MVT設(shè)計(jì)模式

10/04 11:25
599
閱讀需 27 分鐘
加入交流群
掃碼加入
獲取工程師必備禮包
參與熱點(diǎn)資訊討論

創(chuàng)建工程

開(kāi)始本章之前,大家可以先看看我的另一篇文章:Django基本流程

1、這里使用pycharm專(zhuān)業(yè)版進(jìn)行django開(kāi)發(fā),該開(kāi)發(fā)工具確實(shí)很強(qiáng)大,愛(ài)不釋手。

2、創(chuàng)建工程:

在這里插入圖片描述

如圖是創(chuàng)建好的工程,創(chuàng)建方式,如圖演示。

創(chuàng)建工程還可以通過(guò)django-admin命令進(jìn)行,該命令解釋如下:

django-admin --help

在這里插入圖片描述

在使用這個(gè)命令的時(shí)候,有一個(gè)奇怪現(xiàn)象:

(1)直接運(yùn)行時(shí):

在這里插入圖片描述

這條記錄為:
Note that only Django core commands are listed as settings are not properly configured (error: Requested setting INSTALLED_APPS, but s
ettings are not configured. You must either define the environment variable DJANGO_SETTINGS_MODULE or call settings.configure() before
accessing settings.).

(2)縮放窗口后:

在這里插入圖片描述

變成了兩條記錄!內(nèi)容為:
Note that only Django core commands are listed as settings are not properly configured (error: Requested setting INSTALLED_APPS, but settings are not conf Note that only Django core commands are listed as settings are not properly configured (error: Requested setting INSTALLED_APPS, but settings are not configured. You must either define the environment variable DJANGO_SETTINGS_MODULE or call settings.configure() before
accessing settings.).

經(jīng)過(guò)福爾摩斯本人的調(diào)查,上面是pycharm的一個(gè)bug,看似兩條記錄,經(jīng)過(guò)對(duì)比,實(shí)際想說(shuō)的事情,跟第一條是一樣的,所以這本質(zhì)上是一條記錄。(我在測(cè)試方面,有時(shí)候覺(jué)得自己是個(gè)天才?。。。?/p>

我向來(lái)是追求完美的,不允許出現(xiàn)任何瑕疵,這個(gè)是pycharm本身的問(wèn)題,我不處理了,但是拋出的這個(gè)Note,我得處理一下:

在settings文件里面,我又發(fā)現(xiàn)一個(gè)奇怪的問(wèn)題:

“”"
Django settings for mylovedjango project.

Generated by ‘django-admin startproject’ using Django 3.1.

For more information on this file, see
https://docs.djangoproject.com/en/3.1/topics/settings/

For the full list of settings and their values, see
https://docs.djangoproject.com/en/3.1/ref/settings/
“”"

創(chuàng)建使用了django,但文件本身有問(wèn)題:

在這里插入圖片描述

所以需要手動(dòng)導(dǎo)入os模塊,并修改格式,使其能用,而且美觀。通過(guò)上面兩個(gè)小插曲,感覺(jué)這個(gè)django有點(diǎn)不靠譜。按理說(shuō)django團(tuán)隊(duì),不應(yīng)該這樣“馬大哈”呀!難道我下了一個(gè)假的django!不管了,先解決這個(gè)問(wèn)題:

Note that only Django core commands are listed as settings are not properly configured (error: Requested setting INSTALLED_APPS, but s
ettings are not configured. You must either define the environment variable DJANGO_SETTINGS_MODULE or call settings.configure() before
accessing settings.).

查詢官方文檔了解情況:

https://docs.djangoproject.com/en/3.1/ref/django-admin/

在這里插入圖片描述

主要意思為:如果通過(guò)pip安裝Django,那么Django管理腳本應(yīng)該位于系統(tǒng)路徑上。如果不在您的路徑中,請(qǐng)確保您已經(jīng)激活了虛擬環(huán)境。

我也不確定是否用pip安裝了Django,但激活虛擬環(huán)境,應(yīng)該就可以解決該問(wèn)題。好像不激活環(huán)境也能用,這里應(yīng)該是提示你這個(gè)主意事項(xiàng),后續(xù)遇到問(wèn)題可以通過(guò)激活的方式解決。既然不影響,我當(dāng)然選擇,忽略該問(wèn)題啦!小問(wèn)題,不值得我出手,哈哈!不過(guò),win10激活環(huán)境的方式如下:

在這里插入圖片描述

運(yùn)行工程環(huán)境下的activate.bat就可以激活(pycharm創(chuàng)建環(huán)境時(shí),應(yīng)該已經(jīng)自動(dòng)激活)。

創(chuàng)建應(yīng)用

在這里插入圖片描述

如上,使用命令行工具創(chuàng)建應(yīng)用,創(chuàng)建成功,命令如下:

django-admin startapp firstapp

1、注冊(cè)應(yīng)用
工程目錄下的settings文件,在INSTALLED_APPS列表中添加’firstapp.apps.FirstappConfig’,:

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',

    'firstapp.apps.FirstappConfig',
]

如上,即可完成應(yīng)用的注冊(cè)。注冊(cè)的目的,是說(shuō)明該應(yīng)用是合法的,至少在django的“應(yīng)用商店”是合法的。

模型

每個(gè)應(yīng)用都有一個(gè)模型文件models.py,用于定義數(shù)據(jù)字段。

# 查看官方文檔并進(jìn)行配置:
# https://docs.djangoproject.com/en/3.1/ref/settings/#databases

DATABASES = {
    # 'default': {
    #     'ENGINE': 'django.db.backends.sqlite3',
    #     'NAME': BASE_DIR / 'db.sqlite3',
    # }
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'djangostudy',
        'USER': 'root',
        'PASSWORD': 'yeqinfang',
        'HOST': '192.168.31.201',
        'PORT': '3306',
    }
}

運(yùn)行之后報(bào)錯(cuò):

python manage.py runserver

在這里插入圖片描述根據(jù)提示,安裝該客戶端

官方文檔: https://pypi.org/project/mysqlclient/

pip install mysqlclient

在這里插入圖片描述

運(yùn)行之后即可連上數(shù)據(jù)庫(kù)(django自動(dòng)導(dǎo)入了mysqlclient模塊):

在這里插入圖片描述

根據(jù)提示,要使得django工作,得進(jìn)行migrations:

python manage.py makemigrations
python manage.py migrate

在這里插入圖片描述運(yùn)行之后:

在這里插入圖片描述
如上,運(yùn)行成功,說(shuō)明替換mysql數(shù)據(jù)庫(kù)成功,生成表如下:

在這里插入圖片描述

如上,表的名稱默認(rèn)應(yīng)用名稱加上類(lèi)的名稱。

視圖

我們已經(jīng)有了數(shù)據(jù),那么這些數(shù)據(jù)如何展示出來(lái)呢?django是一個(gè)后臺(tái),后臺(tái)的數(shù)據(jù)可以通過(guò)接口提供。所以,視圖就是用于接口的編寫(xiě)的,包含了一些業(yè)務(wù)邏輯。

現(xiàn)在表里面沒(méi)有數(shù)據(jù),我們?cè)趘iews.py里寫(xiě)一些接口進(jìn)行操作:

1、增

該接口用于新增數(shù)據(jù)。

from django.shortcuts import render
from django.http import JsonResponse
import json
from firstapp.models import testmysql

# Create your views here.

def add_data(request):
    response = {}  # 響應(yīng)
    if request.method == "POST":
        req = json.loads(request.body)
    else:
        response["msg"] = "請(qǐng)求方法錯(cuò)誤"
        response["code"] = 400
        return JsonResponse(response)
    # 數(shù)據(jù)持久化(往數(shù)據(jù)庫(kù)寫(xiě)入數(shù)據(jù))
    try:
        data = testmysql()
        data.student_name = req["studentName"]
        data.course_name = req["courseName"]
        data.save()
        response['msg'] = 'success'
        response['error_num'] = 0
    except  Exception as e:
        response['msg'] = str(e)
        response['error_num'] = 1
    return JsonResponse(response)


如上是一個(gè)新增接口,設(shè)置好后,需要配置路由,否者請(qǐng)求不到改接口:

路由配置有三種方式,在urls模塊里面有提示:

“”"mylovedjango URL Configuration

The urlpatterns list routes URLs to views. For more information please see:
https://docs.djangoproject.com/en/3.1/topics/http/urls/
Examples:
Function views
1. Add an import: from my_app import views
2. Add a URL to urlpatterns: path(’’, views.home, name=‘home’)
Class-based views
1. Add an import: from other_app.views import Home
2. Add a URL to urlpatterns: path(’’, Home.as_view(), name=‘home’)
Including another URLconf
1. Import the include() function: from django.urls import include, path
2. Add a URL to urlpatterns: path(‘blog/’, include(‘blog.urls’))
“”"

我們這里采用第三種方式,在應(yīng)用里新增一個(gè)子路由(復(fù)制粘貼urls到應(yīng)用里),并進(jìn)行設(shè)置:

from django.urls import path
from firstapp.views import add_data

urlpatterns = [
    path('firstapp/', add_data),
]

如上,導(dǎo)入接口add_data,然后配置路由,讓外部請(qǐng)求。

接著配置工程目錄的主路由:

from django.urls import path, include


urlpatterns = [
    # path('admin/', admin.site.urls),
    path('', include('firstapp.urls')),
]

在這里插入圖片描述
接著,運(yùn)行程序,并通過(guò)postman進(jìn)行模擬請(qǐng)求:

在這里插入圖片描述
如圖報(bào)錯(cuò),查看后臺(tái)日志為:

在這里插入圖片描述
Forbidden (CSRF cookie not set.): /firstapp/

如上,報(bào)錯(cuò)的原因是,我們配置了cookies的驗(yàn)證,現(xiàn)在我們?cè)谠O(shè)置文件里,把該選項(xiàng)注釋掉:

在這里插入圖片描述注釋掉后自動(dòng)加載,再次請(qǐng)求看看:

在這里插入圖片描述在這里插入圖片描述

如上,請(qǐng)求成功,數(shù)據(jù)寫(xiě)入數(shù)據(jù)庫(kù),至此,完成了新增數(shù)據(jù)接口。

2、查

有了數(shù)據(jù)之后,我們寫(xiě)個(gè)查詢接口,專(zhuān)門(mén)查詢數(shù)據(jù):

def query_data(request, pk):
    response = {}  # 響應(yīng)
    if request.method == "GET":
        query_art = testmysql.objects.all()
        for art in query_art:
            if art.id == pk:
                response["data"] = json.dumps({"id":art.id,
                                               "studentName":art.student_name,
                                               "courseName":art.course_name})
                response["msg"] = "查詢成功"
                response["code"] = 200
            else:
                response["msg"] = "沒(méi)有符合的數(shù)據(jù)"
                response["code"] = 201
                return JsonResponse(response)
    else:
        response["msg"] = "請(qǐng)求方法錯(cuò)誤"
        response["code"] = 400
        return JsonResponse(response)
    # 查詢數(shù)據(jù)
    return JsonResponse(response)

如上,采用GET方法,傳入一個(gè)pk進(jìn)行查詢,應(yīng)用的子路由配置如下:

urlpatterns = [
    path('firstapp/', add_data),
    path('firstapp/<int:pk>/', query_data),
]

驗(yàn)證結(jié)果:

在這里插入圖片描述
如上,查詢成功。不過(guò),后臺(tái)日志有個(gè)301的code:

在這里插入圖片描述
301是重定向,表示當(dāng)用戶或搜索引擎向網(wǎng)站服務(wù)器發(fā)出瀏覽請(qǐng)求時(shí),服務(wù)器返回的HTTP數(shù)據(jù)流中頭信息(header)中的狀態(tài)碼的一種,表示本網(wǎng)頁(yè)永久性轉(zhuǎn)移到另一個(gè)地址。

這個(gè)應(yīng)該是django的內(nèi)部機(jī)制,暫時(shí)忽略。

3、改

現(xiàn)在我們寫(xiě)一個(gè)接口,用于更改數(shù)據(jù)庫(kù)存在的信息:

def update_data(request, pk):
    response = {}  # 響應(yīng)
    if request.method == "PUT":
        req = json.loads(request.body)
        try:
            art = testmysql.objects.get(id=pk)
            art.student_name = req["studentName"]
            art.course_name = req["courseName"]
            art.save()
            response["msg"] = "更新成功"
            response["code"] = 200
            return JsonResponse(response)
        except:
            response["msg"] = "數(shù)據(jù)不正確"
            response["code"] = 401
            return JsonResponse(response)
    else:
        response["msg"] = "請(qǐng)求方法錯(cuò)誤"
        response["code"] = 400
        return JsonResponse(response)

子路由如下:

urlpatterns = [
    path('firstapp/', add_data),
    path('firstapp/<int:pk>/', query_data),
    path('firstapp/update/<int:pk>/', update_data),
]

運(yùn)行之后報(bào)錯(cuò):

在這里插入圖片描述
在這里插入圖片描述
查看后臺(tái),發(fā)現(xiàn)是django默認(rèn)配置導(dǎo)致的。這里說(shuō)的是路由請(qǐng)求的路徑存在問(wèn)題,解決的辦法應(yīng)該有3種:
1、修改子路由
2、請(qǐng)求的時(shí)候完全匹配路徑
3、修改django配置

這里采用第二種:
在這里插入圖片描述在這里插入圖片描述

如上,請(qǐng)求成功。

4、刪

定義一個(gè)刪除接口,用于刪除數(shù)據(jù)。

在views.py文件定義一個(gè)刪除接口:

def delete_data(request, pk):
    response = {}
    if request.method == "DELETE":
        try:
            art = testmysql.objects.get(id=pk)
            art.delete()
            response["msg"] = "刪除成功"
            response["code"] = 200
            return JsonResponse(response)
        except:
            return JsonResponse({"code": "500", "msg": "刪除失敗"})

添加子路由:

urlpatterns = [
    path('firstapp/', add_data),
    path('firstapp/<int:pk>/', query_data),
    path('firstapp/update/<int:pk>/', update_data),
    path('firstapp/delete/<int:pk>/', delete_data),
]

在這里插入圖片描述
在這里插入圖片描述
如上,數(shù)據(jù)已被刪除。

模板

該模塊定義了前端的展示界面,創(chuàng)建django工程時(shí),專(zhuān)門(mén)生成了一個(gè)文件夾,這里放的就是前端代碼。

在這里插入圖片描述
當(dāng)然,django有自帶的模板語(yǔ)法,即HTML代碼+python語(yǔ)言。

現(xiàn)在,我們編寫(xiě)Template將數(shù)據(jù)庫(kù)的字段進(jìn)行展示。

當(dāng)我們使用了Template,就不再是前后端分離模型了,而是django的MVT模型,views視圖返回的,不再是json格式數(shù)據(jù),而是html頁(yè)面。

1、修改query_data,需要使用render返回頁(yè)面

def query_data(request, pk):
    response = {}  # 響應(yīng)
    if request.method == "GET":
        query_art = testmysql.objects.all()
        for art in query_art:
            if art.id == pk:
                response["data"] = json.dumps({"id":art.id,
                                               "studentName":art.student_name,
                                               "courseName":art.course_name})
                response["msg"] = "查詢成功"
                response["code"] = 200
            else:
                response["msg"] = "沒(méi)有符合的數(shù)據(jù)"
                response["code"] = 201
                # return JsonResponse(response)
                return render(request, "firstappweb.html", response)
    else:
        response["msg"] = "請(qǐng)求方法錯(cuò)誤"
        response["code"] = 400
        # return JsonResponse(response)
        return render(request, "firstappweb.html", response)
    # 查詢數(shù)據(jù)
    # return JsonResponse(response)
    return render(request, "firstappweb.html", response)

2、如上,返回的firstappweb.html放在templates文件夾下:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>data for test</title>
</head>
<body>
    <h1>{{ msg }}</h1>
    <h1>{{ code }}</h1>
    <h1>{{ data }}</h1>
</body>
</html>

在這里插入圖片描述
在這里插入圖片描述
輸入地址訪問(wèn):

在這里插入圖片描述
如上,數(shù)據(jù)通過(guò)Templates顯示在了頁(yè)面上。

這就是django的MVT模型。

使用體驗(yàn)

通過(guò)上面的操作,我們發(fā)現(xiàn)django在web開(kāi)發(fā)上,確實(shí)很簡(jiǎn)單!java目前是主流的web開(kāi)發(fā)語(yǔ)言,而django也很難取代他的霸主地位。不過(guò),豆瓣便是django的成功案例。所以,雖然django前途不太樂(lè)觀,但也是可以讓你快速成功的框架。

Django讓web開(kāi)發(fā)更簡(jiǎn)單!

相關(guān)推薦

電子產(chǎn)業(yè)圖譜