Django views.py 視圖層


view.py

后端實例化標簽模版

from django.template import Template,Context # 導入模塊
from django.shortcuts import render,Httpsponse,redirect

在后端實現上傳標簽樣式及內容

def text(request):
	stencil = Template("<h1>{{ user }}</h1>")
    content = Context({'user': '我是cheer'})
    msg = stencil.center(content)
    return HttpResponse(msg)
# 上述操作,標簽就可以生效

json格式數據傳輸

from django.http import JsonResponse # 導入模塊

關於正常傳字典

方式一: 使用json模塊

# def text(request):
#     dic = {'username': '超哥', 'password': '123', 'is_boy': True}
#     json_data = json.dumps(dic,ensure_ascii=False)
#     return HttpResponse(json_data)

方式二: 使用django封裝的json方法

# def text(request):
#     dic = {'username': '超哥', 'password': '123', 'is_boy': True}
#     return JsonResponse(dic, json_dumps_params={'ensure_ascii': False})

關於傳列表

方式一: 使用json模塊

# def text(request):
#     lis = [1, 2, 3, 4, 5]
#     json_data = json.dumps(lis, ensure_ascii=False)
#     return HttpResponse(json_data)

方式二: 使用django封裝的json方法

def text(request):
    lis = [1, 2, 3, 4, 5]

    # return JsonResponse(lis, json_dumps_params={'ensure_ascii': False})  # 報錯
    return JsonResponse(lis, safe=False, json_dumps_params={'ensure_ascii': False}) # 設置safe=False 不報錯

# JsonResponse默認只支持字典類型,如果想要序列化其他數據類型,這個必須是json支持的數據類型,就必須設置safe=False

重寫json的default,支持更多格式

我們打開源碼可以知道,在源碼里面 cls=None

1571831629580

然后往下翻我們可以看到 cls=None 所觸發的條件

1571831737028

這個時候我們就可以看到 JSONEncoder,ctrl+鼠標右鍵左鍵,我們可以看到一個表,在里面的是json支持的數據格式

1571831848599

然后往下翻,我們可以看到在JSONEncoder里面有 default 方法,也就是可以控制報錯的方法.

1571832063270

這個時候我們只要繼承我們的JSONEncoder,把這個類下面的default方法重寫,就可以在輸入json不支持的數據的時候阻止報錯了.變相的來說,就是把不支持的數據變成支持的數據了.

import json
import datetime

ctime = datetime.datetime.today()

class Myjsonclass(json.JSONEncoder):
    def default(self, o):
		if isinstance(o, datetime.datetime):
			return o.strftime('%Y-%m-%d')
		else:
			super().default(self, o)


print(json.dumps({'ctime': ctime}, cls=MyJson))


# 其實就是還是不支持這種數據格式,只是在內部把他改成了字符串等json支持的格式.




還有就是這個方法是json里面自己提供的(最下面的英文)

1571832525346

form表單上傳文件

前端:

<form action="" method="post" enctype="multipart/form-data">
    <form>
        <input type="text" name="username">
        <input type="password" name="password">
        <input type="file" name="up_file">
        <button type="submit" class="btn btn-default">Submit</button>
    </form>
</form>

# 前端的form表單中,只有設置 enctype="multipart/form-data",才可以上傳文件

后端:

def text(request):
    if request.method == 'POST':
		file_obj = request.FILES.get('up_file')
        # 這里拿的對象,可以對象.name,拿到上傳的文件的名字
        with open(file_obj.name,'wb') as fw:
            for line in file_obj.chunks():
                fw.write(line)
                
# chunks() : 這個方法是類似於 read(),但是read()是一次性讀,會很占內存,這個方法是如果文件大於2.5M,就會分段傳輸,不會去大量使用內存,並且這個上限是可以更改的.
           	

CBV

之前寫的都是FBV,就是通過函數去寫的,也就是基於函數的視圖,CBV是基於類的視圖.

如果在類中寫了get和post兩個方法,那么前端來get請求,就會觸發get方法,來post請求就會出發post方法.

1. views.py
# 導包
from django.views import View


class Test(View):
    def get(self, request):
        return render(request, 'test1.html')

    def post(self, request):
        return HttpResponse('我是post請求')
    
    
2. urls.py
url(r'^test/', views.Test.as_view()),

CBV源碼分析

首先,我們輸入網址,就會進入路由與視圖函數對應關系的地方,就會找到url(r'^test/', views.Test.as_view()), 我們可以知道因為as_view()是一個加括號的函數,所以就會先執行as_view().

1571835453332

ctrl+左鍵,點擊進入源碼,看到as_view()下面的view函數返回的就是view,這個就是一個閉包函數,也就是說as_view()返回的其實就是view

1571836044334

我們再看到這個語句中的一句話.在這個里面cls其實就是views.py中我們定義的類,

self就是cls到的對象,對象點方法,應該點的是類中的屬性或者方法,所以這個dispatch應該就是類中的方法(我們寫的get或者post),就想到於執行了這個方法

1571836200993

self因為使我們實例化對象,我們對象中是沒有dispatch這個方法的,所以我們需要去類中找,類也是沒有的,所以我們去父類中找,也就是找view中有沒有dispatch,(這里這么找是因為我們要在看源碼的時候按順序找,而不是直接ctrl+右鍵點進去),然后我們就在view下面找到了dispatch方法

1571836730529

這個就是整個CBV的精髓。我們可以看到,首先它判斷了所有獲取的request.method的小寫形式在不在我源碼文件中自己設置的8個請求里面,

1571836886998

如果在,通過反射的方式賦值給handler,然后返回返回,最終返回之前我們看到閉包的view,也就是說如果過來的是get請求,那么as_view()就會返回get,如果過來的是post請求as_view()就會改編成post,那么urls.py的請求地址就會url(r'^test/', views.Test.get),url(r'^test/', views.Test.post),就會去執行對應的函數。如果8大請求方式里面沒有的話,就會執行報錯函數

1571837521715

Django setting源碼分析

在django中我們知道有兩個配置文件,一個是展示給用戶的,一個是默認配置的,而setting的源碼就是做了如果用戶配置了,並且默認配置的文件里面有所定義的變量,那么就用用戶定義的,用戶寫了沒有的就pass,沒有配置的話就用默認的。

下面是我自己寫的一個簡單的例子

# user_setting
A = True
D = 567

# setting
A = False
B = True
C = True
D = 123

# 源碼
def my_set(self):
    set_lis = []
    set_re_lis = []
    for i in dir(setting):
        if i.isupper():
            set_lis.append(i)

    for j in dir(setting_re):
         if j.isupper():
         set_re_lis.append(j)
         setattr(setting, j, getattr(setting_re, j))
           

意思是這么個意思,簡化很多的那種,就是達到用戶配置了的用用戶的,沒有配置的用自己的


免責聲明!

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



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