Django靜態檔案配置與request物件方法

文章目錄

  • Django靜態檔案配置與request物件方法
    • 一、靜態檔案與配置
      • 1.靜態檔案
        • 範例:
      • 2.靜態檔案配置
      • 3.靜態檔案進階操作
        • 3.1 介面前置詞
        • 3.2 驗證:
        • 補充:
            • 1.你在同一個視窗開了好幾個Django專案,一直在跑的其實是第一個Django專案
            • 2.取消網頁瀏覽器快取
        • 3.3 動態解析
          • 動態解析模板語法:
    • 二、request物件方法
      • 1.form表單回顧
      • 2. form表單三個屬性:
        • 2.1 action引數
          • 三種書寫方式:
        • 2.2 method引數:
          • 請求方式:
      • 3.request物件方法
        • 3.1 request.method
          • 檢視表函式固定格式:
        • 3.2 request.POST
            • requset.POST.get
            • request.POST.getlist
        • 3.3 request.GET
            • request.GET.get
            • request.GET.getlist
        • 3.4 request.FILES
            • request.FILES.get
            • request.FILES.getlist
    • 三、總結

Django靜態檔案配置與request物件方法

少年,我看你骨骼精奇,不如來我部落格看看可好

一、靜態檔案與配置

在平時,我們之所以能夠在瀏覽器裡面輸入網址就可拿到對應的資源,是因為開發者開設了該資源對應的訪問介面,所以我們能夠訪問到對應的資源。

1.靜態檔案

  • 所謂靜態檔案:寫好之後不會自動動態改變的檔案資源,例如我們寫好的css檔案、js檔案、圖像檔案、第三方框架檔案
  • 我們預設將所有的靜態檔案都放在一個static資料夾內,static目錄下基本還會再分幾個資料夾,我們的css檔案,js檔案,圖像檔案、第三方檔案資源等都放在這下面
  • 在Django專案中是沒有這些資料夾的需要我們手動建立。

image-20210318193542034

範例:

舉個範例:在加在靜態資源的時候沒有開設對應的訪問介面

我們先來執行一個Django專案並建立一個static靜態資料夾。

urls.py檔案:

1
2
3
4
5
6
from  app01 import views

urlpatterns = [
    url(r'^admin/', admin.site.urls),
    url(r'^login/', views.login),
]

views.py檔案:

1
2
def login(requset):
    return render(requset,'login.html')

login.html檔案:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>登入介面</title>
    <link rel="stylesheet" href="../static/bootstrap-3.3.7-dist/css/bootstrap-theme.min.css">
    <script src="../static/bootstrap-3.3.7-dist/js/bootstrap.min.js"></script>
</head>
<body>
<div class="container">
    <div class="row">
        <h1 class="text-center">登入</h1>
        <div class="col-lg-8 col-md-offset-2"></div>
    </div>
</div>

</body>
</html>

image-20210318202342015

接下來我們啟動Django專案並訪問,如下:

image-20210318202822145

image-20210318203026841

image-20210318203306981

image-20210318203420359

我們在login右鍵點選檢查,開啟網路主控臺,重新整理頁面,如下:

image-20210318204030278

看到bootstrap框架報錯:404,接下來我們點進去看一下:

image-20210318204425212

然後我們複製請求URL,在瀏覽器中開啟:

image-20210318204810053

還是報錯,請求的資源不存在!我們明明已經匯入了啊!這是為何呢?static路徑等都沒有問題啊!

image-20210318204945129

這是因為我們根本沒有開設該資源對應的介面!所以無法訪問!

2.靜態檔案配置

為了解決上面的問題,我們setting.py加入如下程式碼,也就是靜態檔案配置

1
2
3
4
# setting.py檔案:靜態檔案配置,可以配置多個
STATICFILES_DIRS = [
    os.path.join(BASE_DIR,'static'),
]

靜態檔案配置就是將static的檔案路徑加入。

然後我們再來訪問頁面,重新啟動Django專案。

image-20210318211155648

image-20210318211504664

image-20210318211652113

3.靜態檔案進階操作

針對以上操作,你是不是有很多疑問?小腦袋瓜子是不是充滿了很多問號?

首先,我們來介紹一下,介面前置詞。

3.1 介面前置詞

  • 所謂介面前置詞,就是相當於一個令牌
  • 如果你想要訪問靜態檔案資源,那麼必須以static開頭,你書寫了介面前置詞之後 就擁有了訪問下列串列中所有資料夾內部資源的許可權。
  • 預設書寫在setting.py檔案中,可有多個介面,從上往下依次搜尋,都沒有就會報錯。
1
2
3
4
5
6
STATIC_URL = '/static/'  # HTML中使用的靜態資料夾前置詞,這就是介面前置詞
STATICFILES_DIRS = [
    os.path.join(BASE_DIR, "static"),  # 靜態檔案存放位置
    os.path.join(BASE_DIR,'static1'),   #可以開設多個介面
    os.path.join(BASE_DIR,'static2'),
]

image-20210318215135857

例如,來上面的範例,因為介面前置詞匹配到static檔案開頭,並且開設了對應檔案的介面,所以才會訪問到以上資源。

不信,我們來驗證:

3.2 驗證:

首先,我們新建static1,static2,static1下面新建a.txt,static2下面新建b.txt。

img

內容如下:

1
2
3
4
static1下面的a.txt內容
I'm static A
static2下面的b.txt內容
I'm static B

然後啟動專案,我們來訪問:

image-20210318221827616

image-20210318221925018

還不信的話,我們來修改一下STATIC_URL = '/static/',如圖所示:

image-20210318222900928

然後重啟專案訪問。

image-20210318223241963

補充:

當你在寫Django專案的時候,可能回出現後端程式碼修改了但是前端頁面沒有變化的情況:

1.你在同一個視窗開了好幾個Django專案,一直在跑的其實是第一個Django專案
2.取消網頁瀏覽器快取

右鍵–》檢查–》shortcuts–》Preferences–》Disable cache…

image-20210318223813577

image-20210318223944306

Edge瀏覽器:(中文是不是看起來很舒適?)

image-20210318230559360

谷歌瀏覽器

image-20210318225602215

3.3 動態解析

接著上面的範例,我們再來啟動Django專案。

image-20210318233858397

然後我們把令牌改為Shawn,接著又可以了。

image-20210318234414502

image-20210318234512974

這時,產品經理拍著你的肩膀突然來一句說:這樣不好,在改一下…

然後你又要改回去,就這樣反反覆復。

於是就出現了動態解析

動態解析模板語法:
1
2
3
{<!-- -->% load static %} 模板語法
<link rel="stylesheet" href="{% static 'bootstrap-3.3.7-dist/css/bootstrap.min.css' %}">
<script src="{% static 'bootstrap-3.3.7-dist/js/bootstrap.min.js' %}"></script>

然後我們將模板語法加入html檔案中,然後重啟Django專案。

image-20210319000041070

image-20210318235950717

我們在來修改令牌,然後隨便你怎麼改,令牌都可以動態解析到,都可以訪問到資源。

image-20210319000354281

image-20210319000517404

image-20210319000735176

image-20210319000846880

還不明白?我們來看一張圖,有圖有真相:

img

二、request物件方法

1.form表單回顧

  • 作用:將使用者輸入的資料提交到後端,預設使用的是get請求。

2. form表單三個屬性:

2.1 action引數

作用:控制後端提交的路徑

三種書寫方式:
  1. 不寫:預設朝當前頁面地址提交資料
  2. 只寫後序:/index/,將當前伺服端的ip+port拼接到後序前面然後訪問
  3. 全寫:https://www.mzitu.com,向指定地址提交資料(指名道姓)

範例:例如我們寫一個簡單的登入頁面

繼續使用上面的程式碼,login.html檔案內容如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>登入介面</title>
    {<!-- -->#    <link rel="stylesheet" href="/shawn/bootstrap-3.3.7-dist/css/bootstrap-theme.min.css">#}
    {<!-- -->#    <script src="/shawn/bootstrap-3.3.7-dist/js/bootstrap.min.js"></script>#}

    {<!-- -->% load static %} {<!-- -->#模板語法,類似於導模組#}
    <link rel="stylesheet" href="{% static 'bootstrap-3.3.7-dist/css/bootstrap.min.css' %}">
    <script src="{% static 'bootstrap-3.3.7-dist/js/bootstrap.min.js' %}"></script>
</head>
<body>
<div class="container">
    <div class="row">
        <h1 class="text-center">登入</h1>
        <div class="col-lg-8 col-md-offset-2"></div>
        <form action="">
            <p>username:<input type="text" name="username" class="form-control"></p>
            <p>password:<input type="password" name="password" class="form-control"></p>
            <input type="submit" class="btn btn-success btn-block">
        </form>
    </div>
</div>

</body>
</html>

view.py檔案

1
2
3
4
5
6
from django.shortcuts import render

# Create your views here.
def login(requset):
    print("我看你骨骼驚奇,來來看我的部落格吧!")
    return render(requset,'login.html')

get請求

不寫

image-20210319213621088

或者只寫後序:

image-20210319215209310

然後提交資料

image-20210319213830615

然後驚奇的發現我們提交的資料都跑到URLhttp://127.0.0.1:8888/login/?username=123&password=123裡面去了,並沒有提交到後端。

image-20210319214040537

這是因為action引數預設使用的是get請求,pycharm內列印出如下內容:

image-20210319215851413

2.2 method引數:

作用:指定請求的方式

請求方式:
  1. get請求:資料是直接放在URL後面的, 以"?「分割URL和傳輸資料,引數之間以」&"相連

    例如:http://127.0.0.1:8888/login/?username=123&password=123

  2. post請求:把提交的資料放在HTTP包的請求體中,不會顯示到URL中,就是隱藏起來。

範例:在form表單中加入method引數將請求方式改為post請求,再次啟動Django專案。

post請求:

在login.html修改檔案如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>登入介面</title>
    {<!-- -->#    <link rel="stylesheet" href="/shawn/bootstrap-3.3.7-dist/css/bootstrap-theme.min.css">#}
    {<!-- -->#    <script src="/shawn/bootstrap-3.3.7-dist/js/bootstrap.min.js"></script>#}

    {<!-- -->% load static %} {<!-- -->#模板語法,類似於導模組#}
    <link rel="stylesheet" href="{% static 'bootstrap-3.3.7-dist/css/bootstrap.min.css' %}">
    <script src="{% static 'bootstrap-3.3.7-dist/js/bootstrap.min.js' %}"></script>
</head>
<body>
<div class="container">
    <div class="row">
        <h1 class="text-center">登入</h1>
        <div class="col-lg-8 col-md-offset-2"></div>
        <form action="login.html " method="post">
            <p>username:<input type="text" name="username" class="form-control"></p>
            <p>password:<input type="password" name="password" class="form-control"></p>
            <input type="submit" class="btn btn-success btn-block">
        </form>
    </div>
</div>

</body>
</html>

image-20210319221336935

然後點選提交:

123

結果報錯403:請求資源不可用,拒絕訪問。

image-20210319224418891

這是因為中介軟體的作用(暫時不用理解): 需要註解setting.py檔案里MIDDLEWARE中一行內容

剛開始學習時可在設定檔中暫時禁用csrf中介軟體,方便表單提交測試。

1
2
3
4
5
6
7
8
9
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',
]

image-20210319225411753

註解掉之後,然後我們再來重新提交資料,pycharm列印出如下:

image-20210319224818729

3.request物件方法

3.1 request.method

  • 取得當前請求的請求方法並且結果是一個純大寫的字串型別

範例:取得當前請求方法

view.py檔案

1
2
3
4
5
6
7
8
from django.shortcuts import render


# Create your views here.
def login(requset):
    print(requset.method, type(requset.method))  # 取得當前請求資料的方法,並且結果是一個純大寫的字串型別
    # 回傳給瀏覽器一個登入頁面
    return render(requset, 'login.html')

然後在瀏覽器提交表單

image-20210320003331866

pycharm顯示如下,然後就可以取得到當前的請求方法:

image-20210320003730202

通常呢,我們使用get請求回傳一個頁面,而post情求取得使用者訊息,資料校驗等一些複雜的操作,那我們在這裡如何實現呢?

簡單,只需要寫個if判斷即可。

view.py檔案

1
2
3
4
5
6
7
8
9
10
11
12
from django.shortcuts import render, HttpResponse


# Create your views here.
def login(requset):
    # print(requset.method, type(requset.method))  # 取得當前請求資料的方法,並且結果是一個純大寫的字串型別  <class 'str'>
    if requset.method == "GET":
        # 回傳給瀏覽器一個登入頁面
        return render(requset, 'login.html')
    elif requset.method == "POST":
        # POST 請求提交資料
        return HttpResponse("好好學習,天天向上!")

然後使用POST請求向後端提交資料,而使用GET請求就會回傳一個頁面。

但是,你有沒有發現這樣寫的話後面程式碼寫多了就會使層級變得複雜。

因為檢視表函式預設就是用來處理get請求的,所以我們將程式碼精簡如下:

檢視表函式固定格式:
1
2
3
4
5
6
7
8
from django.shortcuts import render, HttpResponse,redirect


# Create your views here.
def login(requset):
    if requset.method == "POST":  # POST 請求提交資料
        return HttpResponse("好好學習,天天向上!")
    return render(requset, "login.html")  # 如果是get請求回傳給瀏覽器一個登入頁面

解決了上面問題,那麼我們怎麼去取得使用者請求資料呢?

首先我們開啟中斷點除錯,然後在瀏覽器提交資料,就可以看到我們剛剛提交的資料了。

image-20210320011910594

任意一個出現request物件出現的行加上斷電除錯,然後DEBUG模式執行,可以取得到request物件的方法

3.2 request.POST

  • 取得使用者提交的POST請求資料(不包含檔案)
  • 資料型態:回傳的是一個字典型別

views.py檔案

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
from django.shortcuts import render, HttpResponse, redirect


# Create your views here.
def login(requset):
    '''
    get 情請求和post情求應該有不同的處理機制
    :param requset:請求相關的資料物件,裡面有很多簡易的方法
    :return:
    '''
    if requset.method == "POST":  # POST 請求提交資料
        print(requset.POST)  # 取得使用者提交的POST請求 (不包含檔案)
        #<QueryDict: {'username': ['1314'], 'password': ['1414']}>
        return HttpResponse("好好學習,天天向上!")
    return render(requset, "login.html")  # 如果是get請求回傳給瀏覽器一個登入頁面

瀏覽器提交資料,pycharm列印如下:

image-20210320130521113

然後我們再來取得使用者名稱,看看它到底是什麼資料型態。

requset.POST.get
  • get方法會取得串列最後一個元素

我們在views.py檔案加入get方法:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
from django.shortcuts import render, HttpResponse, redirect


# Create your views here.
def login(requset):
    '''
    get 情請求和post情求應該有不同的處理機制
    :param requset:請求相關的資料物件,裡面有很多簡易的方法
    :return:
    '''
    if requset.method == "POST":  # POST 請求提交資料
        print(requset.POST)  # 取得使用者提交的POST請求 (不包含檔案)
        # <QueryDict: {'username': ['1314'], 'password': ['1414']}>
        username = requset.POST.get("username") # get方法會只會得到串列最後一個元素
        print(username, type(username))  # 1314 <class 'str'>
        return HttpResponse("好好學習,天天向上!")
    return render(requset, "login.html")  # 如果是get請求回傳給瀏覽器一個登入頁面

提交資料後,得到一個字串的資料型態。

image-20210320131943008

而且,**get方法會取得串列最後一個元素,**不信,我們來驗證一下:

在login.html檔案中多新增一個使用者名稱。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>登入介面</title>
    {<!-- -->% load static %} {<!-- -->#模板語法,類似於導模組#}
    <link rel="stylesheet" href="{% static 'bootstrap-3.3.7-dist/css/bootstrap.min.css' %}">
    <script src="{% static 'bootstrap-3.3.7-dist/js/bootstrap.min.js' %}"></script>
</head>
<body>
<div class="container">
    <div class="row">
        <h1 class="text-center">登入</h1>
        <div class="col-md-8 col-md-offset-2">
            <form action="login.html " method="post">
                username:
                <input type="text" name="username" class="form-control">
                <input type="text" name="username" class="form-control">
                password:
                <input type="password" name="password" class="form-control">
                <input type="submit" class="btn btn-success btn-block">
            </form>
        </div>
    </div>
</div>

</body>
</html>

image-20210320132600873

然後前端提交不同的兩個使用者名稱,如下:

image-20210320132822897

然後得到串列最後一個元素。

image-20210320133004652

問題又來了,如果取得使用者的愛好呢?使用者的愛好是可以有多個的那麼怎麼樣去取得呢?

login.html檔案:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>登入介面</title>
    {<!-- -->% load static %} {<!-- -->#模板語法,類似於導模組#}
    <link rel="stylesheet" href="{% static 'bootstrap-3.3.7-dist/css/bootstrap.min.css' %}">
    <script src="{% static 'bootstrap-3.3.7-dist/js/bootstrap.min.js' %}"></script>
</head>
<body>
<div class="container">
    <div class="row">
        <h1 class="text-center">登入</h1>
        <div class="col-md-8 col-md-offset-2">
            <form action="login.html " method="post">
                username:
                <input type="text" name="username" class="form-control">
                username:
                <input type="text" name="username" class="form-control">
                password:
                <input type="password" name="password" class="form-control">
                <input type="submit" class="btn btn-success btn-block">
                <p>
                    <input type="checkbox" name="hobby" value="bas">籃球
                    <input type="checkbox" name="hobby" value="foot">足球
                    <input type="checkbox" name="hobby" value="study">學習
                </p>
            </form>
        </div>
    </div>
</div>

</body>
</html>

image-20210320133750855

request.POST.getlist
  • 取得整個串列

views.py檔案

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
from django.shortcuts import render, HttpResponse, redirect


# Create your views here.
def login(requset):
    '''
    get 情請求和post情求應該有不同的處理機制
    :param requset:請求相關的資料物件,裡面有很多簡易的方法
    :return:
    '''
    if requset.method == "POST":  # POST 請求提交資料
        print(requset.POST)  # 取得使用者提交的POST請求 (不包含檔案)
        # <QueryDict: {'username': ['1314'], 'password': ['1414']}>
        username = requset.POST.get("username")
        passwd =requset.POST.get("password")
        print(username, type(username))  # 1314 <class 'str'>
        hobby =requset.POST.getlist('hobby')    # 取得整個串列
        print(username,passwd,hobby)    
        return HttpResponse("好好學習,天天向上!")
    return render(requset, "login.html")  # 如果是get請求回傳給瀏覽器一個登入頁面

前端提交資料,然後後端取得到的資料如下:

image-20210320134557452

image-20210320134942032

3.3 request.GET

  • 取得url問號後面的資料

  • 資料型態:回傳的是一個字典型別

views.py檔案

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
from django.shortcuts import render, HttpResponse, redirect


# Create your views here.
def login(requset):
    '''
    get請求和post情求應該有不同的處理機制
    :param requset:請求相關的資料物件,裡面有很多簡易的方法
    :return:
    '''
    if requset.method == "POST":  # POST 請求提交資料
        print(requset.POST)  # 取得使用者提交的POST請求 (不包含檔案)
        # <QueryDict: {'username': ['1314'], 'password': ['1414']}>
        username = requset.POST.get("username")
        passwd =requset.POST.get("password")
        print(username, type(username))  # 1314 <class 'str'>
        hobby =requset.POST.getlist('hobby')    # 取得整個串列
        print(username,passwd,hobby)    
        return HttpResponse("好好學習,天天向上!")
    print(requset.GET)  # <QueryDict: {'username': ['lili'], 'password': ['123']}>
    return render(requset, "login.html")  # 如果是get請求回傳給瀏覽器一個登入頁面

前端提交urlhttp://127.0.0.1:8888/login/login.html/?username=lili&password=123

後端回傳資料:

image-20210320140813730

它和POST一樣都有兩個方法:

request.GET.get
  • get方法會取得串列最後一個元素
request.GET.getlist
  • 取得到整個串列

views.py檔案

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
from django.shortcuts import render, HttpResponse, redirect


# Create your views here.
def login(requset):
    '''
    get 情請求和post情求應該有不同的處理機制
    :param requset:請求相關的資料物件,裡面有很多簡易的方法
    :return:
    '''
    if requset.method == "POST":  # POST 請求提交資料
        print(requset.POST)  # 取得使用者提交的POST請求 (不包含檔案)
        # <QueryDict: {'username': ['1314'], 'password': ['1414']}>
        username = requset.POST.get("username")
        passwd =requset.POST.get("password")
        print(username, type(username))  # 1314 <class 'str'>
        hobby =requset.POST.getlist('hobby')    # 取得整個串列
        print(username,passwd,hobby)    
        return HttpResponse("好好學習,天天向上!")
    print(requset.GET)
    print(requset.GET.get('username'))
    print(requset.GET.getlist('hobby'))
    return render(requset, "login.html")  # 如果是get請求回傳給瀏覽器一個登入頁面

前端提交urlhttp://127.0.0.1:8888/login/login.html/?username=lili&password=123

後端輸出資料如下:
image-20210320141859019

接下來我盟再來看看如何取得檔案。

3.4 request.FILES

  • 取得使用者上傳的檔案資料
  • 直接看成是字典即可
request.FILES.get
  • 取得串列最後一個元素
request.FILES.getlist
  • 取得整個串列

login.html檔案

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>登入介面</title>
    {<!-- -->% load static %} {<!-- -->#模板語法,類似於導模組#}
    <link rel="stylesheet" href="{% static 'bootstrap-3.3.7-dist/css/bootstrap.min.css' %}">
    <script src="{% static 'bootstrap-3.3.7-dist/js/bootstrap.min.js' %}"></script>
</head>
<body>
<div class="container">
    <div class="row">
        <h1 class="text-center">登入</h1>
        <div class="col-md-8 col-md-offset-2">
            <form action="login.html " method="post">
                username:
                <input type="text" name="username" class="form-control">
                username:
                <input type="text" name="username" class="form-control">
                password:
                <input type="password" name="password" class="form-control">
                <input type="submit" class="btn btn-success btn-block">
                <p>
                    <input type="checkbox" name="hobby" value="bas">籃球
                    <input type="checkbox" name="hobby" value="foot">足球
                    <input type="checkbox" name="hobby" value="study">學習
                </p>
                <p>
                    <input type="file" name="myfile">
                </p>
            </form>
        </div>
    </div>
</div>

</body>
</html>

image-20210320142709890

views.py檔案

1
2
3
4
5
6
7
8
9
10
11
12
13
14
from django.shortcuts import render, HttpResponse, redirect


# Create your views here.
def login(requset):
    '''
    get 情請求和post情求應該有不同的處理機制
    :param requset:請求相關的資料物件,裡面有很多簡易的方法
    :return:
    '''
    if requset.method == "POST":  # POST 請求提交資料
        print(requset.POST)  # 取得使用者提交的POST請求 (不包含檔案)
        return HttpResponse("好好學習,天天向上!")
    return render(requset, "login.html")  # 如果是get請求回傳給瀏覽器一個登入頁面

前端提交資料

image-20210320143027300

後端輸出如下:

image-20210320143401099

並沒有拿到我們需要的檔案物件。

這是因為:針對檔案資料,不能使用request.POST取得,該方法只能取得到檔名。

然後我們使用requset.FILES方法取得檔案物件

views.py檔案

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
from django.shortcuts import render, HttpResponse, redirect


# Create your views here.
def login(requset):
    '''
    get 情請求和post情求應該有不同的處理機制
    :param requset:請求相關的資料物件,裡面有很多簡易的方法
    :return:
    '''
    if requset.method == "POST":  # POST 請求提交資料
        print(requset.POST)  # 取得使用者提交的POST請求 (不包含檔案)
        # 針對檔案資料,不能使用request.POST取得,該方法只能取得到檔名。
        print(requset.FILES)
        return HttpResponse("好好學習,天天向上!")
    return render(requset, "login.html")  # 如果是get請求回傳給瀏覽器一個登入頁面

效果如下:

134

注意: form表單如果需要攜帶檔案資料 那麼要新增引數 : enctype="multipart/form-data"

login.html檔案

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>登入介面</title>
    {<!-- -->% load static %} {<!-- -->#模板語法,類似於導模組#}
    <link rel="stylesheet" href="{% static 'bootstrap-3.3.7-dist/css/bootstrap.min.css' %}">
    <script src="{% static 'bootstrap-3.3.7-dist/js/bootstrap.min.js' %}"></script>
</head>
<body>
<div class="container">
    <div class="row">
        <h1 class="text-center">登入</h1>
        <div class="col-md-8 col-md-offset-2">
            <form action="login.html" method="post" enctype="multipart/form-data">
                username:
                <input type="text" name="username" class="form-control">
                username:
                <input type="text" name="username" class="form-control">
                password:
                <input type="password" name="password" class="form-control">
                <input type="submit" class="btn btn-success btn-block">
                <p>
                    <input type="checkbox" name="hobby" value="bas">籃球
                    <input type="checkbox" name="hobby" value="foot">足球
                    <input type="checkbox" name="hobby" value="study">學習
                </p>
                <p>
                    <input type="file" name="myfile">
                </p>
            </form>
        </div>
    </div>
</div>

</body>
</html>

image-20210320144943806

效果展示如下:

image-20210320145539938

三、總結

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
1.form表單回顧
    form表單預設使用的是get請求
        action
        控制後端提交的路徑
            1.不寫:預設朝當前頁面地址提交資料
           2.後序:/index/
           3.全寫:https://www.mzitu.com
        method
            get
          post
2.request物件方法
   request.method
        取得當前請求的請求方法並且結果是一個純大寫的字串型別
   request.POST  # 直接看成是字典即可
        取得使用者提交post請求過來的基本資料(不包含檔案)
        get()  # 取得串列最後一個元素
       getlist()  # 取得整個串列
   request.GET  # 直接看成是字典即可
        取得url問號後面的資料
        get()  # 取得串列最後一個元素
       getlist()  # 取得整個串列
   request.FILES  # 直接看成是字典即可
        取得使用者上傳的檔案資料
        '''
        form表單如果需要攜帶檔案資料 那麼要新增引數
        <form action="login.html" method="post" enctype="multipart/form-data">
        '''
       get()  # 取得串列最後一個元素
       getlist()  # 取得整個串列
       
"""
檢視表函式書寫格式
    def login(request):
        if request.method == 'POST':
            return HttpResponse("好好學習,天天向上")
        return render(request,'login.html')
"""