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

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

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

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

這個時候我們只要繼承我們的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里面自己提供的(最下面的英文)

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().

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

我們再看到這個語句中的一句話.在這個里面cls其實就是views.py中我們定義的類,
self就是cls到的對象,對象點方法,應該點的是類中的屬性或者方法,所以這個dispatch應該就是類中的方法(我們寫的get或者post),就想到於執行了這個方法

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

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

如果在,通過反射的方式賦值給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大請求方式里面沒有的話,就會執行報錯函數

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))
意思是這么個意思,簡化很多的那種,就是達到用戶配置了的用用戶的,沒有配置的用自己的
