一惶凝、靜態(tài)文件
- 配置settings.py
STATIC_URL='/static/'
STATICFILES_DIRS = [
os.path.join(BASE_DIR, 'static'),
]
- 使用
#加載靜態(tài)文件
{% load static %}
#鏈接到靜態(tài)文件
<img src="{% static 'elema/img/1.jpeg' %}">
二、中間件
- 應(yīng)用場(chǎng)景
本質(zhì): 就是一個(gè)python類
應(yīng)用場(chǎng)景: 統(tǒng)計(jì)叨叙、黑名單私恬、白名單、反爬...
- 中間件方法
- __init__
不需要傳參麦萤,服務(wù)器響應(yīng)第一個(gè)請(qǐng)求的時(shí)鹿鳖,會(huì)自動(dòng)調(diào)用,用于確定是否啟用中間件
- process_request(self,request)
在視圖執(zhí)行前調(diào)用(即分配url匹配視圖之前),每個(gè)請(qǐng)求都會(huì)調(diào)用壮莹,返回None或HttpResponse對(duì)象
- process_view(self,request,view_func,view_args,view_kwargs)
調(diào)用視圖之前執(zhí)行,每個(gè)請(qǐng)求都會(huì)調(diào)用翅帜,返回None或HttpResponse對(duì)象
- process_templae_response(self,request,response)
在視圖剛好執(zhí)行完后調(diào)用,每個(gè)請(qǐng)求都會(huì)調(diào)用命满,返回None或HttpResponse對(duì)象
- process_response(self,request,response)
所有響應(yīng)返回瀏覽器之前調(diào)用涝滴,每個(gè)請(qǐng)求都會(huì)調(diào)用,返回None或HttpResponse對(duì)象
- process_exception(self,request,exception)
當(dāng)視圖出現(xiàn)異常時(shí)調(diào)用胶台,返回HttpResponse對(duì)象
備注: 為什么會(huì)返回HttpRespons對(duì)象歼疮?因?yàn)樵谡?qǐng)求進(jìn)來(lái)后如果有問(wèn)題,就可以不做后續(xù)處理概作,直接給客戶端響應(yīng)腋妙。
-
方法執(zhí)行順序
- 自定義中間件并使用
在工程目錄下middleware目錄下創(chuàng)建應(yīng)用目錄
- 在middleware/elema中創(chuàng)建一個(gè)elemamiddleware.py
from django.utils.deprecation import MiddlewareMixin
class MyMiddle(MiddlewareMixin):
# 在視圖執(zhí)行前調(diào)用
def process_request(self,reqeust):
print('get請(qǐng)求,參數(shù)name: ', reqeust.GET.get('name'))
- 配置settings.py文件(即在MIDDLEWARE中添加上述文件的位置)
'middleware.elema.elemamiddleware.MyMiddle'
- 中間件(黑名單攔截)
# 攔截器讯榕,攔截他黑名單中的IP
class MyMiddle(MiddlewareMixin):
def process_request(self, request):
if request.META['REMOTE_ADDR'] in getattr(settings, 'BLOCKED_IPS', []):
return HttpResponse('<h1>Forbidden</h1>')
# settings.py中
BLOCKED_IPS = [ # IP黑名單 '192.168.0.100' ]
- 中間件(未登陸處理)
class MyMiddle(MiddlewareMixin):
def process_request(self, request):
# request.META['REMOTE_ADDR'] 請(qǐng)求的IP地址
if request.path !='/meituan/login/': # 檢測(cè)如果不是登錄的話
if "username" in request.COOKIES: # 已經(jīng)登錄不做任何處理
pass
else: # 未登錄,重定向到登錄頁(yè)面
return HttpResponseRedirect('/meituan/login/')
三匙睹、文件上傳
- 注意
- 文件上傳時(shí)愚屁,文件數(shù)據(jù)存儲(chǔ)在request.FILES屬性中
- form表單要上傳文件需要加 enctype="multipart/form-data"
- 上傳文件必須是post請(qǐng)求
- 存儲(chǔ)路徑
- 在static目錄下創(chuàng)建upfile目錄用于存儲(chǔ)接受上傳的文件
- 配置settings.py文件
MDEIA_ROOT = os.path.join(BASE_DIR,'static/upfile')
- 文件內(nèi)容
# 獲取表單上傳的文件內(nèi)容
file = request.FILES['file']
#設(shè)置上傳文件的保存路徑
filePath = os.path.join(settings.MDEIA_ROOT,file.name)
#文件寫入后臺(tái)
with open(filepath,'wb') as fp:
四、分頁(yè)
- Paginator(列表痕檬,每頁(yè)個(gè)數(shù))
#屬性
- .count:對(duì)象總頁(yè)數(shù)
- .num_pages: 頁(yè)面總數(shù)
- .page_range: 頁(yè)碼列表(頁(yè)碼從1開始)
- page(num):是Paginator的方法
#屬性
- .object_list:當(dāng)前頁(yè)面上所有的數(shù)據(jù)(對(duì)象)列表
- .number:當(dāng)前頁(yè)的頁(yè)碼值
- .paginator:當(dāng)前page對(duì)象關(guān)聯(lián)的paginator對(duì)象
#方法
- .has_next():判斷是否有下一頁(yè)霎槐,如果有返回Ture
- .has_previous:判斷是否有上一頁(yè),如果有返回Ture
- .has_other_pages():判斷是否有上一頁(yè)或下一頁(yè)梦谜,如果有返回Ture
- .next_page_number(): 返回下一頁(yè)的頁(yè)碼丘跌,如果下一頁(yè)不存在拋出InvalidPage異常
- .previous_page_number(): 返回上一頁(yè)的頁(yè)碼,如果上一頁(yè)不存在拋出InvalidPage異常
- .len():返回當(dāng)前頁(yè)數(shù)據(jù)的個(gè)數(shù)
- 實(shí)例
# 所有商品數(shù)據(jù)
alllist = Goods.objects.all()
#切片處理
alllist = Goods.objects.all()[0:5]
# 12條數(shù)據(jù)為一頁(yè)唁桩,劃分總頁(yè)數(shù)
# 分頁(yè)對(duì)象
paginator = Paginator(list(alllist),12)
# 根據(jù)傳入的頁(yè)碼得到Page對(duì)象
pageobj = paginator.page(page)
# 當(dāng)前頁(yè)的所有數(shù)據(jù)列表(遍歷獲缺帐鳌)
pageodj_list = pageobj.object_list
for goods in pageobj_list