標籤:one 技術 指定 range efi hello action isnull 根據
靜態檔案的設定靜態檔案概述:
在網頁使用的css檔案,js檔案和圖片叫做靜態檔案。
設定流程:
- 在項目目錄中建立static檔案夾
- 在建立的檔案夾裡分別建立js,css,img檔案夾
- 在setting.py檔案中做以下配置
STATICFILES_DIRS = [os.path.join(BASE_DIR, ‘static‘)] # 設定靜態檔案的物理地址
- 設定靜態檔案路徑
STATIC_URL = ‘/abc/‘ # 和物理目錄是對應的關係, 邏輯上的概念
動態擷取STATIC_URL的方法
{% load staticfiles %}
<img src="{% static ‘img/mm.jpg‘ %}" >
<img src="/abc/img/mm.jpg" >
# 以上兩種效果相同
動態擷取STATIC_URL的地址<br><img src="/abc/img/mm.jpg" >
總結:
- /abc/img/mm.jpg 隱藏了伺服器端實際儲存檔案的目錄
- 當STATIC_URL = ‘/abc/‘這個路徑設定為/abc/時載入圖片時會到物理地址STATICFILES_DIRS設定項目錄下去尋找,尋找時的路徑從img檔案夾開始
中介軟體
點擊查看中介軟體詳解: http://www.crazyant.net/1001.html
擷取訪問瀏覽器的ip地址:
request.META[‘REMOTE_ADDR‘]
作用:根據指定的Ip限制瀏覽器的使用者訪問伺服器
自訂中介軟體類
- 在應用的目錄裡面建立middleware.py
- 在該檔案當中建立中介軟體類-->類裡面建立中介軟體函數
- 在setting.py中配置中介軟體MIDDLEWARE_CLASSES裡面添加
函數調用順序說明:
- __init__ --服務啟動接受第一個url請求調用
- process_request --產生request對象,url匹配之前調用
- prosess_view --url匹配之後,視圖函數之前調用
- prosess_response --視圖函數調用完成之後調用,內容返回給瀏覽器之前調用
- prosess_exception --視圖函數內部發生異常的時候調用
注意
調用順序:當有多個異常類的時候會全部調用,調用順序與註冊順序相反
class BlockedIPMiddleWare(): """建立阻止中介軟體的類""" def process_view(self, request, func_view, *view_args, **view_kwargs): """會在url配置之後函數調用之前調用""" addr = request.META[‘REMOTE_ADDR‘] if addr == ‘127.0.0.1‘: return HttpResponse(‘middleware block!!!‘)
阻止ip案例Code
class TestMiddleWare(): """建立測試的中介軟體類""" def __init__(self): print(‘----init----‘) def process_request(self, request): print(‘----process_request----‘) # return HttpResponse(‘--process_request--‘) def process_view(self, request, view_func, *view_args, **view_kwargs): print(‘----process_view----‘) # return HttpResponse(‘--process_view--‘) def process_response(self, request, response): print(‘----process_response----‘) # return HttpResponse(‘--process_response--hello--kay--‘) return response # 如果在執行中介軟體的過程當中返回了httpResponse對象都會調用 # process_response()這個函數 # 只要返回httpResponsedui對象就會調用
中介軟體函數Code
class ExceptionTestMiddleWare(object): """異常中介軟體類""" def process_exception(self, request, exception): print(‘----exception_1----‘) print(exception) # 參數exception返回的是異常對象
異常中間類Code上傳照片配置上傳圖片過程:
MEDIA_ROOT=os.path.join(BASE_DIR,"static/media")
- 在static路徑下建立media檔案夾
- 在建立的media檔案夾下建立booktest檔案夾用於儲存booktest應用中視圖上傳的照片
- 建立包含圖片的模型類
class PicTest(models.Model): """建立上傳圖片的模型類""" gpic = models.ImageField(upload_to=‘booktest‘) # 指定上傳圖片的路徑
from django.conf import settingsdef upload_action(request): """上傳圖片的函數""" # 1.接受上傳的檔案 pic = request.FILES.get(‘pic‘) # print(pic.chunks) # 2.拼接儲存的路徑 save_path = "%s/booktest/%s" % (settings.MEDIA_ROOT, pic.name) # 3.開啟檔案 # save_file = open(save_path, ‘wb‘) # save_file.close() # 4.快捷方法 with open(save_path, ‘wb‘) as sava_file: # 5.傳遞過來的內容是分塊的, 所以要遍曆寫 for file in pic.chunks(): # 6.寫資料 sava_file.write(file) # 儲存到資料庫 p = PicTest() p.gpic = ‘booktest/%s‘ % pic.name p.save() return HttpResponse(‘ok‘)
上傳圖片視圖中Code
<form action="/upload_action/" method="post" enctype="multipart/form-data"> {% csrf_token %} <input type="file" name="pic"> <input type="submit" value="上傳"></form>
上傳照片模板中Code
def use_pic(request): """使用資料庫本地的圖片 1.從資料尋找出圖片對應的照片的路徑 2.返回給http頁面 3.在http頁面當中載入 """ pic_path = PicTest.objects.get(id=1) print(pic_path.gpic) return render(request, ‘booktest/use_pic.html‘, {"pic_path": pic_path.gpic})
使用上傳的照片視圖中的Code
<img src="/static/media/{{ pic_path }}" >
使用上傳的照片模板中的Code分頁
Django提供了資料分頁的類,這些類被定義在django/core/paginator.py中。 對象Paginator用於對列進行一頁n條資料的分頁運算。對象Page用於表示第m頁的資料。
paginator對象
- 方法init(列表,int):返回分頁對象,參數為列表資料,每面資料的條數。
- 屬性count:返回對象總數。
- 屬性num_pages:返回頁面總數。
- 屬性page_range:返回頁碼列表,從1開始,例如[1, 2, 3, 4]。
- 方法page(m):返回Page對象,表示第m頁的資料,下標以1開始。
Page對象
- 調用Paginator對象的page()方法返回Page對象,不需要手動構造。
- 屬性object_list:返回當前頁對象的列表。
- 屬性number:返回當前是第幾頁,從1開始。
- 屬性paginator:當前頁對應的Paginator對象。
- 方法has_next():如果有下一頁返回True。
- 方法has_previous():如果有上一頁返回True。
- 方法len():返回當前頁面對象的個數。
- 迭代頁面對象:訪問當前頁面中的每個對象。
def show_prov(request, index): """顯示所有的省級地區 1.建立分頁的對象 2.擷取第一頁的內容 3.擷取所有的頁碼內容顯示到html頁面上 4.處理點擊更新顯示的內容 """ areas = AreaInfo.objects.filter(aparent__isnull=True) # areas分頁的內容 每10個分一頁 建立分頁的對象 paginator = Paginator(areas, 10) # 總共有多少頁的頁碼 page_list = paginator.page_range # 擷取第一頁的內容 # 判斷如果url為show_prov的時候匹配不到數字則為空白所以進行判斷一下 如果為空白就顯示第一頁 if not index: index = 1 page = paginator.page(index) # 下一頁的數子 # 給模板傳遞下一頁的頁碼數 next_index = int(index) + 1 # 給模板傳遞上一頁的頁碼數 previous_index = int(index) - 1 return render(request, ‘booktest/page_test.html‘, {‘page‘: page, ‘page_list‘: page_list, "next_index": next_index, ‘previous_index‘: previous_index})
分頁檢視中的Code
<body><ul> {% for area in page %} <li>{{ area.atitle }}</li> {% endfor %}</ul>{# 如果有下一頁則反回True #}{% if page.has_previous %} <a href="/show_prov{{ previous_index }}">上一頁</a>{% endif %}{% for page_index in page_list %} {% comment %} page.number 返回當前的頁面數 根據page判斷是否還有下一個頁面/上一頁的選項 {% endcomment %} {% if page_index == page.number %} {{ page_index }} {% else %} <a href="/show_prov{{ page_index }}">{{ page_index }}</a> {% endif %}{% endfor %}{# 如果有下一頁則反回True #}{% if page.has_next %} <a href="/show_prov{{ next_index }}">下一頁</a>{% endif %}</body>
分頁模板中的Code
# 位置參數可有可無url(r‘^show_prov(\d*)/$‘, views.show_prov)
分頁url配置Code
Django中輔助技術總結[靜態檔案,中介軟體,上傳圖片,分頁案例]