1. 程式人生 > >(轉)python 全棧開發,Day67(Django簡介)

(轉)python 全棧開發,Day67(Django簡介)

昨日內容回顧

複製程式碼
1. socket建立伺服器

2. http協議:
    請求協議
       請求首行     請求方式 url?a=1&b=2  協議
       請求頭       key:value
       請求體       a=1&b=2(只有post請求才有請求體)
         
    響應協議 
        響應首行    協議 狀態碼 文字
        響應頭      key:value
        響應體      html字串

3. wsgiref模組(基於wsgi協議)

    功能:
        
1. 按著http協議請求格式解析請求資料----envision:{} 2. 按著http協議響應格式封裝響應資料----response 4 基於wsgiref實現了一個簡單web框架 1. urls : 存放路由關係 2 views: 存放檢視函式 3 templates: 存放html檔案 4 wsgi-sever:啟動檔案
複製程式碼

 

一、Django簡介

知識預覽

  • MVC與MTV模型

  • Django的下載與基本命令

  • 基於Django實現的一個簡單示例

 

MVC與MTV模型

MVC

Web伺服器開發領域裡著名的MVC模式,所謂MVC就是把Web應用分為模型(M),控制器(C)和檢視(V)三層,他們之間以一種外掛式的、鬆耦合的方式連線在一起,模型負責業務物件與資料庫的對映(ORM),檢視負責與使用者的互動(頁面),控制器接受使用者的輸入呼叫模型和檢視完成使用者的請求,其示意圖如下所示:

mvc主要用於web框架,常用的開發語言,有java,php,node.js等等。

web框架應用最廣泛就是PHP了,它只能做web開發,而且開發效率很快。

 

MTV

Django的MTV模式本質上和MVC是一樣的,也是為了各元件間保持鬆耦合關係,只是定義上有些許不同,Django的MTV分別是值:

M 代表模型(Model): 負責業務物件和資料庫的關係對映(ORM)。
T 代表模板 (Template):負責如何把頁面展示給使用者(html)。
V 代表檢視(View): 負責業務邏輯,並在適當時候呼叫Model和Template。
除了以上三層之外,還需要一個URL分發器,它的作用是將一個個URL的頁面請求分發給不同的View處理,View再呼叫相應的Model和Template,MTV的響應模式如下所示:

一般是使用者通過瀏覽器向我們的伺服器發起一個請求(request),這個請求回去訪問檢視函式,(如果不涉及到資料呼叫,那麼這個時候檢視函式返回一個模板也就是一個網頁給使用者),檢視函式呼叫模型,模型去資料庫查詢資料,然後逐級返回,檢視函式把返回的資料填充到模板中空格中,最後返回網頁給使用者。

 

這裡面最難的部分就是model,後面會慢慢講到。

django 有一個ORM,它是專門來操作資料庫的。這套語法,需要大量練習才能掌握。

 

MVC和MTV模型的區別:

複製程式碼
MVC:
    M : model (與資料庫打交道)
    V :  views  (存放html檔案)
    C : Controller(邏輯控制部分)        
MTV 
    M : model     (與資料庫打交道)
    T : templates    (存放html檔案)    
    V : views      (邏輯處理)
    +
    路由控制層(分發哪一個路徑由哪一個檢視函式處理),它沒有單獨的分層。它作為URL分發器,將url請求分發給不同的view處理
複製程式碼

 

Django的下載與基本命令

1、下載Django:

pip3 install django

2、建立一個django project

windows使用者,以管理員身份開啟一個cmd視窗。進入一個空目錄,執行以下命令:

E:\python_script\django框架\day2>django-admin startproject mysite

當前目錄下會生成mysite的工程,目錄結構如下:

複製程式碼
mysite/
├── manage.py
└── mysite
    ├── __init__.py
    ├── settings.py
    ├── urls.py
    └── wsgi.py
複製程式碼

manage.py ----- Django專案裡面的工具,通過它可以呼叫django shell和資料庫等。
settings.py ---- 包含了專案的預設設定,包括資料庫資訊,除錯標誌以及其他一些工作的變數。
urls.py ----- 負責把URL模式對映到應用程式。

 

manage.py : 它不關是啟動檔案,它還是與Django互動的檔案。比如:

python manage.py  runserver   : 執行專案
python manage.py  startapp    : 建立應用

如果執行專案時,不指定埠,預設監聽本機的8000埠。

3、在mysite目錄下建立應用

#進入mysite目錄
E:\python_script\django框架\day2>cd mysite
#建立應用blog
E:\python_script\django框架\day2\mysite>python manage.py startapp blog

目錄結構如下:

複製程式碼
mysite/
├── blog
│   ├── admin.py
│   ├── apps.py
│   ├── __init__.py
│   ├── migrations
│   │   └── __init__.py
│   ├── models.py
│   ├── tests.py
│   └── views.py
├── manage.py
└── mysite
    ├── __init__.py
    ├── settings.py
    ├── urls.py
    └── wsgi.py
複製程式碼

views.py---存放檢視函式

models--與資料庫打交道

還有一個目錄templates,它是用來存放html檔案的,下面會講到。

 

從上面的目錄結構可以看出,mysite目錄下有一個blog。那麼頂層的mysite,叫做 專案。底層的blog叫做應用。

比如微信是一個專案。聊天,朋友圈,支付...都是應用。
專案是必須包含應用的,專案可以包含多個應用。

mysite下的mysite,是全域性檔案,它有2個全域性配置檔案,一個是settings.py(專案配置檔案),一個是urls.py(路由控制檔案)。

wsgi.py是封裝socket,用來接收和響應請求的。這個檔案,從來都不需要動。

 

4、啟動django專案

複製程式碼
E:\python_script\django框架\day2\mysite>python manage.py runserver 8080
Performing system checks...

System check identified no issues (0 silenced).

You have 14 unapplied migration(s). Your project may not work properly until you apply the migrations for app(s): admin, auth, contenttypes, sessions.
Run 'python manage.py migrate' to apply them.
June 21, 2018 - 19:33:29
Django version 2.0.6, using settings 'mysite.settings'
Starting development server at http://127.0.0.1:8080/
Quit the server with CTRL-BREAK.
複製程式碼

這樣我們的django就啟動起來了!當我們訪問:http://127.0.0.1:8080/時就可以看到:

基於Django實現的一個簡單示例

url控制器

修改mysite目錄下的urls.py,增加index路徑

注意:index後面不要加括號。直接views.index即可

必須匯入blog應用的views模組,否則它找不到對應的檢視函式

from django.contrib import admin
from django.urls import path
from blog import views

urlpatterns = [
    path('admin/', admin.site.urls),
    path('index/',views.index),
]
View Code

檢視

修改blog目錄下的views.py,增加index檢視函式

from django.shortcuts import render
import datetime

# Create your views here.

def index(request):
    now=datetime.datetime.now()
    ctime=now.strftime("%Y-%m-%d %X")

    return render(request,"index.html",{"ctime":ctime})
View Code

request,它是一個物件。儲存了請求資訊,比如請求路徑,請求方式,GET資料,POST資料...等等。

request引數必須要有,不管你用不用它。

 

模板

新建資料夾templates,在此目錄建立index.html

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

<h4>當前時間:{{ ctime }}</h4>

</body>
</html>
View Code

修改mysite目錄下的settings.py,指定模板目錄為templates,修改部分如下:

TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [os.path.join(BASE_DIR, 'templates')],
        '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',
            ],
        },
    },
]
View Code

訪問網頁,效果如下:

 django有一個好處,程式碼更改之後,它會自動載入程式碼。而不需要重啟django專案,網頁就能更新了!

 

增加登入頁面

修改mysite目錄下的urls.py,新增一個login

urlpatterns = [
    path('admin/', admin.site.urls),
    path('index/',views.index),
    path('login/',views.login),
]
View Code

在templates目錄下建立檔案login.html

注意:form表單的標籤名是form,不是from。from是MySQL的關鍵字,不要弄混淆了。否則點選提交按鈕,是沒有反應的。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<form action="">
    <lable>使用者名稱</lable><input type="text" name="user"/>
    <lable>使用者名稱</lable><input type="password" name="pwd"/>
    <input type="submit">
</form>

</body>
</html>
View Code

修改blog目錄下的views.py,增加login檢視函式

from django.shortcuts import render
import datetime

# Create your views here.

def index(request):
    now=datetime.datetime.now()
    ctime=now.strftime("%Y-%m-%d %X")

    return render(request,"index.html",{"ctime":ctime})

def login(request):
    return render(request,"login.html")
View Code

訪問登入頁面,效果如下:

為什麼render能找到login.html檔案呢?
因為setting.py檔案裡面定義了template路徑。render方法,是用來渲染模板的,它會從TEMPLATES配置的路徑中去尋找html檔案。

如果修改DIRS裡面的檔名,比如改為abc

'DIRS': [os.path.join(BASE_DIR, 'abc')],

訪問頁面,會報錯

重新修改回來,再次訪問,就正常了。

 

修改urls.py,增加auth路徑,用來做驗證的。

urlpatterns = [
    path('admin/', admin.site.urls),
    path('index/',views.index),
    path('login/',views.login),
    path('auth/',views.auth),
]
View Code

修改login.html檔案,改為post請求

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<form action="/auth/" method="post">
    <lable>使用者名稱</lable><input type="text" name="user"/>
    <lable>使用者名稱</lable><input type="password" name="pwd"/>
    <input type="submit">
</form>

</body>
</html>
View Code

修改views.py檔案,增加auth檢視函式

from django.shortcuts import render,HttpResponse
import datetime

# Create your views here.

def index(request):
    now=datetime.datetime.now()
    ctime=now.strftime("%Y-%m-%d %X")

    return render(request,"index.html",{"ctime":ctime})

def login(request):
    return render(request,"login.html")

def auth(request):
    print(request.path)  # 路徑
    print(request.method)  # 請求方式
    print(request.GET)  # GET資料
    print(request.POST)  # POST資料
    return HttpResponse("OK")
View Code

訪問登入頁面,輸入資料,點選提交

頁面輸出403,被CSRF攔截了。

CSRF:跨站請求偽造,常縮寫為CSRF或者XSRF,是一種對網站的惡意利用。

後面的課程會講到,如何避免CSRF。修改settings.py裡面的MIDDLEWARE 配置項,關閉CSRF

MIDDLEWARE = [
    'django.middleware.security.SecurityMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.common.CommonMiddleware',
    # 'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    'django.middleware.clickjacking.XFrameOptionsMiddleware',
]
View Code

 

訪問方式

訪問方式有2種,GET和POST

在位址列中,只有GET請求。

在form表單中,有GET和POST。它是根據method屬性決定的!一般表單使用POST

 

再次訪問url,輸入表單資訊,點選提交。

輸出ok,表示正常。注意:這裡還沒有做登入認證,下面會講到!

檢視cmd視窗輸出資訊:

/auth/
POST
<QueryDict: {}>
<QueryDict: {'user': ['xiao'], 'pwd': ['123']}>

可以看到:

路徑:/auth/。請求方式: POST。GET資料為空。POST資料是一個字典。

 

位址列直接輸入:

http://127.0.0.1:8080/auth/?u=xiao,sex=m

檢視cmd視窗輸出資訊:

/auth/
GET
<QueryDict: {'u': ['xiao,sex=m']}>
<QueryDict: {}>

 

登入認證

正常網站,使用者名稱和密碼是儲存在資料庫中。由於還沒有學到django連線資料庫,所以這裡將使用者名稱和密碼寫死,模擬登入行為。

修改views.py,獲取使用者和密碼,進行判斷。

from django.shortcuts import render,HttpResponse
import datetime

# Create your views here.

def index(request):
    now=datetime.datetime.now()
    ctime=now.strftime("%Y-%m-%d %X")

    return render(request,"index.html",{"ctime":ctime})

def login(request):
    return render(request,"login.html")

def auth(request):
    user = request.POST.get('user')  # 獲取使用者名稱
    pwd = request.POST.get('pwd') # 獲取密碼
    print(user,pwd)
    #判斷使用者名稱和密碼
    if user == 'xiao' and pwd == '123':
        return HttpResponse("登入成功")  # 返回響應體給瀏覽器,顯示"登入成功"文字
    else:
        return render(request,"login.html")  # 返回響應體-->login.html檔案內容
View Code

重新訪問登入頁面,輸入正確的使用者名稱和密碼

頁面提示,成功。

 

訪問過程分析

訪問登入頁面時,經歷3個步驟

(1) http://127.0.0.1:8000/login/   get請求 無資料
(2) path('login/',views.login),    調轉檢視函式login(request)
(3) login                          執行檢視函式,響應了一個login.html頁面

解釋:

1. 首先是使用者在瀏覽器輸入url:http://127.0.0.1:8000/login/

2. django接收到請求之後,根據URL控制器匹配檢視函式

3. 執行檢視函式login,響應請求給瀏覽器一個login.html頁面。

 

檢視views.py檔案的login檢視函式

render(request,"login.html")

上面的程式碼就是響應體。那麼瀏覽器如何得到response資訊的呢?封裝response資訊是由wsgi來完成的。

 

點選提交按鈕的操作,也經歷3個步驟

(1) http://127.0.0.1:8000/auth/   post請求,資料為user=xiao&pwd=123
(2) path('auth/',views.auth),    調取檢視函式auth(request)
(3) auth      執行檢視函式, if 登陸成功:響應一個字串登陸成功。else:  響應了一個登陸頁面

解釋:

1. 雖然form的action屬性值為"/auth/",但是執行提交動作時,瀏覽器會檢視action屬性,如果為相對路徑。那麼會獲取當前url的域名/IP加埠。和action屬性拼接,得到完整的url,比如:http://127.0.0.1:8000/auth/。將表單資料以POST方式傳送給此url。

注意:推薦使用這種寫法。如果action寫成完整的url(比如:http://127.0.0.1:8000/auth/),遇到伺服器遷移時。那麼涉及到的html檔案,都需要更改,非常耗時耗力!

如果採用相對路徑方式,那麼不需要改動程式碼,它會自動拼接,完美解決這個問題。

比如寫/auth/,會自動拼接為http://127.0.0.1:8000/auth/

如果action為"",也就是空,它會拼接當前的完整ur。

比如訪問登入頁面,那麼action的屬性值為 當前url,比如:http://127.0.0.1:8000/login/

2. django接收到請求之後,根據URL控制器匹配檢視函式auth

3. 執行檢視函式,如果使用者名稱和密碼正確,頁面顯示登入成功。否則,頁面還是顯示登入頁面。

 

上面提到的2個場景,它們之間,是沒有任何關係的。

每一個請求,對於伺服器而言,都是一個新的請求。

 

思考一個問題,能夠將login和auth檢視函式合併?

答案是可以的。

更改login.html,將action屬性設定為空(參考上面的步驟1解釋)

<form action="" method="post">

更改views.py,刪除auth檢視函式程式碼,修改login檢視函式,完整程式碼如下:

from django.shortcuts import render,HttpResponse
import datetime

# Create your views here.

def index(request):
    now=datetime.datetime.now()
    ctime=now.strftime("%Y-%m-%d %X")

    return render(request,"index.html",{"ctime":ctime})

def login(request):
    #判斷請求是否為POST,必須為大寫
    if request.method == "POST":
        user = request.POST.get('user')  # 獲取使用者名稱
        pwd = request.POST.get('pwd')  # 獲取密碼
        print(user, pwd)
        # 判斷使用者名稱和密碼
        if user == 'xiao' and pwd == '123':
            return HttpResponse("登入成功")  # 返回響應體給瀏覽器,顯示"登入成功"文字
        else:
            return render(request, "login.html")  # 返回響應體-->login.html檔案內容

    return render(request,"login.html")  # 預設輸出登入頁面
View Code

修改urls.py,刪除auth路徑

urlpatterns = [
    path('admin/', admin.site.urls),
    path('index/',views.index),
    path('login/',views.login),
]
View Code

重新訪問登入頁面,輸入正確的使用者和密碼,點選提交。頁面輸出:

這就用到了if分支。
能儘量合成檢視函式的,推薦合成。如果邏輯簡單,可以合成。
邏輯比較複雜的,還是建議分開。

 

檢視函式,必須返回一個HttpResponse物件。HttpResponse是一個物件,物件裡面,放字串。

HttpResponse會自動將字串轉換為位元組
django要求檢視函式,必須返回一個HttpResponse物件。

 

模擬render操作

修改login函式,else部分是重點

def login(request):
    #判斷請求是否為POST,必須為大寫
    if request.method == "POST":
        user = request.POST.get('user')  # 獲取使用者名稱
        pwd = request.POST.get('pwd')  # 獲取密碼
        print(user, pwd)
        # 判斷使用者名稱和密碼
        if user == 'xiao' and pwd == '123':
            return HttpResponse("登入成功")  # 返回響應體給瀏覽器,顯示"登入成功"文字
        else:
            from mysite import settings  # 匯入settings模組
            import os
            # 拼接login.html的絕對路徑
            path = os.path.join(settings.BASE_DIR,"templates","login.html")
            with open(path,encoding="utf-8") as f:
                data = f.read()  # 讀取檔案所有內容
            print("data",data+'aaaaa')
            #返回給瀏覽器並加上一段話
            return HttpResponse(data+'使用者名稱和密碼錯誤')
            # return render(request, "login.html")  # 返回響應體-->login.html檔案內容

    return render(request,"login.html")  # 預設輸出登入頁面
View Code

訪問url: http://127.0.0.1:8000/login/

輸入一個錯誤的密碼,點選提交

頁面輸出,使用者名稱和密碼錯誤

那麼,render就是幹了這些事情。

 

總結:

對於Django而言,一次請求必須返回一個HttpResponse(字串)

request物件,存放了請求路徑,請求方式,請求資料,比如GET和POST

所以對於檢視函式而言,最關心的部分就是request和HttpResponse

一次請求,必有一次響應。如果沒有響應,就會報錯

 

範圍url: http://127.0.0.1:8000/index/

在檢視函式中,render是渲染的意思。那麼它是如何工作的呢?

複製程式碼
1 按著settings-TEMPLATES-DIRS路徑找指定檔案
2 讀取檔案所有字串
3 渲染: 檢查字串中是否有{{變數}}    ,
    if 沒有找到:
        HttpResponse(檔案字串)
    else
        找到 {{變數}},用render第三個引數中的對應值進行相應替換(如果沒有找到對應值,{{變數}}替換為空)
        HttpResponse(替換後的檔案字串)
複製程式碼

那麼渲染的過程,是在後端完成的。不是前端完成的。
看html程式碼,就知道了。瀏覽器根本不認識{{變數}},它只能識別html,css,js

注意:如果模板裡面,寫了{{變數}} 。但是render沒傳,那麼頁面中{{變數}} 會被替換為空。

如果模板裡面,寫了{{ }} 。變數名沒寫,那麼頁面報錯

 

如果render傳了變數,但是模板裡{{變數}} ,變數名寫錯了,頁面中{{變數}} 也會被替換為空。

 

 

思考:如何點選時間的時候,變成紅色?

 直接加行內樣式?不對,它是點選的時候,才變成紅色。

需要引入jquery來做,修改index.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <script src="https://cdn.bootcss.com/jquery/3.3.1/jquery.min.js"></script>
</head>
<body>
<h4>當前時間: <span class="time">{{ ctime }}</span></h4>
<script type="application/javascript">
    $(function(){
        $('.time').click(function () {
            $(this).css("color","red")
        })
    });
</script>
</body>
</html>
View Code

訪問url: http://127.0.0.1:8000/index/

點選時間,就會變紅

但是,線上伺服器不能這麼幹?為什麼呢?因為如果一旦jquery訪問連結失效。那麼整個網站就崩潰了!

所以這種檔案,還是需要放到自己的伺服器上,才行!

那好辦呀,將jquery.min.js放到templates目錄。

編輯index.html,直接引入jquery.min.js檔案。

<script src="jquery.min.js"></script>

再次訪問頁面,怎麼點選都沒效果,檢視控制檯,點選網路部分,發現它是404了!

不要以為templates下的檔案,可以隨便訪問。太天真了!

瀏覽器是不能直接訪問templates下的檔案,需要Django找到靜態檔案才行!

在根目錄,建立static目錄,它是專門存放靜態檔案的。
將js檔案進去。專案目錄結構如下:

複製程式碼
mysite/
├── blog
│   ├── admin.py
│   ├── apps.py
│   ├── __init__.py
│   ├── models.py
│   ├── tests.py
│   └── views.py
├── manage.py
├── mysite
│   ├── __init__.py
│   ├── settings.py
│   ├── urls.py
│   └── wsgi.py
├── static
│   └── jquery.min.js
└── templates
    ├── index.html
    └── login.html
複製程式碼

修改settings.py,最後一行新增,注意:STATIC_URL和它是成對使用的。

STATIC_URL = '/static/'
STATICFILES_DIRS = (
    os.path.join(BASE_DIR,"static"),
)

STATIC_URL引數,表示別名。

STATICFILES_DIRS表示物理路徑。

STATIC_URL代指STATICFILES_DIRS定義的路徑。
修改index.html,更改src屬性

<script src="/static/jquery.min.js"></script>

注意:這裡面的/static/ 是別名,它代指的是物理路徑

重新訪問頁面,再次點選,就會變紅。

 

因為diango利用字首STATIC_URL的具體內容,來對映STATICFILES_DIRS, 那麼它就可以找到具體的檔案。

比如前臺頁面的靜態資源路徑,一般都是寫死了,可能涉及到幾百個網頁。網站在運營過程中,難免後臺伺服器,需要做遷移工作,可能和之前的儲存路徑不一樣的。這個時候,讓前端去改幾百個網頁,是一個很繁雜的工作。現在只需要修改STATIC_URL,就可以完美解決這個問題!!!

 

 未完待續...

 

在 success: 後面定義回撥函式處理返回的資料,需要使用 JSON.parse(data)



轉載宣告:
出處:https://www.cnblogs.com/xiao987334176/


昨日內容回顧

複製程式碼
1. socket建立伺服器

2. http協議:
    請求協議
       請求首行     請求方式 url?a=1&b=2  協議
       請求頭       key:value
       請求體       a=1&b=2(只有post請求才有請求體)
         
    響應協議 
        響應首行    協議 狀態碼 文字
        響應頭      key:value
        響應體      html字串

3. wsgiref模組(基於wsgi協議)

    功能:
        1. 按著http協議請求格式解析請求資料----envision:{} 
               2. 按著http協議響應格式封裝響應資料----response    
        
4 基於wsgiref實現了一個簡單web框架

    1. urls : 存放路由關係
    2 views: 存放檢視函式
    3 templates: 存放html檔案
    4 wsgi-sever:啟動檔案
複製程式碼

 

一、Django簡介

知識預覽

  • MVC與MTV模型

  • Django的下載與基本命令

  • 基於Django實現的一個簡單示例

 

MVC與MTV模型

MVC

Web伺服器開發領域裡著名的MVC模式,所謂MVC就是把Web應用分為模型(M),控制器(C)和檢視(V)三層,他們之間以一種外掛式的、鬆耦合的方式連線在一起,模型負責業務物件與資料庫的對映(ORM),檢視負責與使用者的互動(頁面),控制器接受使用者的輸入呼叫模型和檢視完成使用者的請求,其示意圖如下所示:

mvc主要用於web框架,常用的開發語言,有java,php,node.js等等。

web框架應用最廣泛就是PHP了,它只能做web開發,而且開發效率很快。

 

MTV

Django的MTV模式本質上和MVC是一樣的,也是為了各元件間保持鬆耦合關係,只是定義上有些許不同,Django的MTV分別是值:

M 代表模型(Model): 負責業務物件和資料庫的關係對映(ORM)。
T 代表模板 (Template):負責如何把頁面展示給使用者(html)。
V 代表檢視(View): 負責業務邏輯,並在適當時候呼叫Model和Template。
除了以上三層之外,還需要一個URL分發器,它的作用是將一個個URL的頁面請求分發給不同的View處理,View再呼叫相應的Model和Template,MTV的響應模式如下所示:

一般是使用者通過瀏覽器向我們的伺服器發起一個請求(request),這個請求回去訪問檢視函式,(如果不涉及到資料呼叫,那麼這個時候檢視函式返回一個模板也就是一個網頁給使用者),檢視函式呼叫模型,模型去資料庫查詢資料,然後逐級返回,檢視函式把返回的資料填充到模板中空格中,最後返回網頁給使用者。

 

這裡面最難的部分就是model,後面會慢慢講到。

django 有一個ORM,它是專門來操作資料庫的。這套語法,需要大量練習才能掌握。

 

MVC和MTV模型的區別:

複製程式碼
MVC:
    M : model (與資料庫打交道)
    V :  views  (存放html檔案)
    C : Controller(邏輯控制部分)        
MTV 
    M : model     (與資料庫打交道)
    T : templates    (存放html檔案)    
    V : views      (邏輯處理)
    +
    路由控制層(分發哪一個路徑由哪一個檢視函式處理),它沒有單獨的分層。它作為URL分發器,將url請求分發給不同的view處理
複製程式碼

 

Django的下載與基本命令

1、下載Django:

pip3 install django

2、建立一個django project

windows使用者,以管理員身份開啟一個cmd視窗。進入一個空目錄,執行以下命令:

E:\python_script\django框架\day2>django-admin startproject mysite

當前目錄下會生成mysite的工程,目錄結構如下:

複製程式碼
mysite/
├── manage.py
└── mysite
    ├── __init__.py
    ├── settings.py
    ├── urls.py
    └── wsgi.py
複製程式碼

manage.py ----- Django專案裡面的工具,通過它可以呼叫django shell和資料庫等。
settings.py ---- 包含了專案的預設設定,包括資料庫資訊,除錯標誌以及其他一些工作的變數。
urls.py ----- 負責把URL模式對映到應用程式。

 

manage.py : 它不關是啟動檔案,它還是與Django互動的檔案。比如:

python manage.py  runserver   : 執行專案
python manage.py  startapp    : 建立應用

如果執行專案時,不指定埠,預設監聽本機的8000埠。

3、在mysite目錄下建立應用

#進入mysite目錄
E:\python_script\django框架\day2>cd mysite
#建立應用blog
E:\python_script\django框架\day2\mysite>python manage.py startapp blog

目錄結構如下:

複製程式碼
mysite/
├── blog
│   ├── admin.py
│   ├── apps.py
│   ├── __init__.py
│   ├── migrations
│   │   └── __init__.py
│   ├── models.py
│   ├── tests.py
│   └── views.py
├── manage.py
└── mysite
    ├── __init__.py
    ├── settings.py
    ├── urls.py
    └── wsgi.py
複製程式碼

views.py---存放檢視函式

models--與資料庫打交道

還有一個目錄templates,它是用來存放html檔案的,下面會講到。

 

從上面的目錄結構可以看出,mysite目錄下有一個blog。那麼頂層的mysite,叫做 專案。底層的blog叫做應用。

比如微信是一個專案。聊天,朋友圈,支付...都是應用。
專案是必須包含應用的,專案可以包含多個應用。

mysite下的mysite,是全域性檔案,它有2個全域性配置檔案,一個是settings.py(專案配置檔案),一個是urls.py(路由控制檔案)。

wsgi.py是封裝socket,用來接收和響應請求的。這個檔案,從來都不需要動。

 

4、啟動django專案

相關推薦

python 開發Day67(Django簡介)

昨日內容回顧 1. socket建立伺服器 2. http協議: 請求協議 請求首行 請求方式 url?a=1&b=2 協議 請求頭 key:value 請求體 a=1&b

python 開發Day68(Django的路由控制)

昨日內容回顧 1 MVC和MTV MTV 路由控制層(分發哪一個路徑由哪一個檢視函式處理) V : views (邏輯處理) T : templates (存放html檔案) M :

python 開發Day73(django多表新增,基於物件的跨表查詢)

昨日內容回顧 多表方案: 如何確定表關係呢? 表關係是在2張表之間建立的,沒有超過2個表的情況。 那麼相互之間有2條關係線,先來判斷一對多的關係。 如果其中一張表的記錄能夠對應另外一張表的多條記錄,那麼關係線成立! 如果只

python 開發Day76(Django元件-cookie,session)

 昨日內容回顧 1 json 輕量級的資料交換格式 在python 序列化方法:json.dumps() 反序列化方法:json.loads() 在JS中: 序列化方法:JSON.stringfy()

python 開發Day75(Django與Ajax,檔案上傳,ajax傳送json資料,基於Ajax的檔案上傳,SweetAlert外掛)

昨日內容回顧 基於物件的跨表查詢 正向查詢:關聯屬性在A表中,所以A物件找關聯B表資料,正向查詢 反向查詢:關聯屬性在A表中,所以B物件找A物件,反向查詢 一對多: 按欄位:xx book --

python 開發Day74(基於雙下劃線的跨表查詢,聚合查詢,分組查詢,F查詢,Q查詢)

昨日內容回顧 # 一對多的新增方式1(推薦) # book=Book.objects.create(title="水滸傳",price=100,pub_date="1643-4-12",publish_id=1) # print(book.title) # 一對多的新增

python 開發Day72(昨日作業講解,昨日內容回顧,Django多表建立)

昨日作業講解 1.圖書管理系統 實現功能:book單表的增刪改查 1.1 新建一個專案bms,建立應用book。過程略... 1.2 手動建立static目錄,並在目錄裡面建立css資料夾,修改settings.py,設定static的目錄位置 STATI

python 開發Day71(模型層-單表操作)

昨日內容回顧 1. {% include '' %} 2. extend base.html: <html> ..... ..... .....

python 開發Day70(模板自定義標籤和過濾器,模板繼承 (extend),Django的模型層-ORM簡介)

昨日內容回顧 檢視函式: request物件 request.path 請求路徑 request.GET GET請求資料 QueryDict {} request.POST POST請求資料 Que

python 開發Day79(Django的使用者認證元件,分頁器)

一、Django的使用者認證元件 使用者認證  auth模組 在進行使用者登陸驗證的時候,如果是自己寫程式碼,就必須要先查詢資料庫,看使用者輸入的使用者名稱是否存在於資料庫中; 如果使用者存在於資料庫中,然後再驗證使用者輸入的密碼,這樣一來就要自己編寫大量的程式碼。 事實上,Djang

python 開發Day78(Django元件-forms元件)

一、Django元件-forms元件 forms元件 django中的Form元件有以下幾個功能: 生成HTML標籤 驗證使用者資料(顯示錯誤資訊) HTML Form提交保留上次提交資料 初始化頁面顯示內容 校驗欄位功能 之前寫的檢視函式,提交的資料,

python 開發Day84(django請求生命週期,FBV和CBV,ORM拾遺,Git)

一、django 請求生命週期 流程圖: 1. 當用戶在瀏覽器中輸入url時,瀏覽器會生成請求頭和請求體發給服務端請求頭和請求體中會包含瀏覽器的動作(action),這個動作通常為get或者post,體現在url之中. 2. url經過Django中的wsgi,再經過Django的中介軟

python 開發Day81(部落格系統個人主頁,文章詳情頁)

一、個人主頁 隨筆分類 需求:查詢當前站點每一個分類的名稱以及對應的文章數 完成這個需求,就可以展示左側的分類 它需要利用分組查詢,那麼必須要會基於雙下劃線的查詢。 基於雙下劃線的查詢,簡單來講,就是用join。將多個表拼接成一張表,那麼就可以單表操作了! 表關係圖 圖中

python 開發Day82(點贊和踩滅,使用者評論)

一、點贊和踩滅 樣式 先來做樣式,修改article_detail.html,增加div_digg的div {% extends "base.html" %} {% block content %} <div class="article_info

python 開發Day80(部落格系統分析,部落格主頁展示)

一、部落格系統分析 資料庫的構建 首先,我們分析一個部落格系統的功能: 一個部落格可以有多個標籤(多對多) 一個部落格可以有多條評論(一對多) 一個部落格只可以有一個類別(多對一) 接下來,我們分析關係的屬性: 部落格:標題,作者,內容,釋出時間,分類(外來鍵),

python 開發Day83(部落格系統子評論,後臺管理,富文字編輯器kindeditor,bs4模組)

一、子評論 必須點選回覆,才是子評論!否則是根評論點選回覆之後,定位到輸入框,同時加入@評論者的使用者名稱 定位輸入框 focus focus:獲取物件焦點觸發事件 先做樣式。點選回覆之後,定位到輸入框,加入被評論的使用者名稱 給回覆的a標籤加一個class=reply_btn,關

自學Python開發第三次筆記pycharm的使用

文件 templates 空白 cti pycharm 模板 utf body 筆記 這幾天學習了pycharm的使用。 模板:新建:File---》settings---》File and code Templates---》PythonScript 添加頭部

python開發【第九篇】Python常用模塊一主要是re正則和collections

順序 常用模塊 內置 object 簡潔 整體 re.search lec 快速 一、認識模塊    什麽是模塊:一個模塊就是一個包含了python定義和聲明的文件,文件名就是加上.py的後綴,但其實import加載的模塊分為四個通用類別 :     1.使用python

python開發【第十一篇】Python常用模塊三hashlib,configparser,logging

錯誤 .config lte with open sha 警告 輸入 格式化 pass hashlib模塊 hashlib提供了常見的摘要算法,如md5和sha1等等。 那麽什麽是摘要算法呢?摘要算法又稱為哈希算法、散列算法。它通過一個函數,把任意長度的數據轉換為一個長度固

python開發【第十篇】Python常用模塊二時間、random、os、sys和序列化

utc時間 用戶 這也 文件名 password 如何 json字符串 並且 持久 一、time模塊 表示時間的三種方式:   時間戳:數字(計算機能認識的)   時間字符串:t=‘2012-12-12‘   結構化時間:time.struct_time(tm_year=2