Django中輔助技術總結[靜態檔案,中介軟體,上傳圖片,分頁案例]

來源:互聯網
上載者:User

標籤:one   技術   指定   range   efi   hello   action   isnull   根據   

靜態檔案的設定靜態檔案概述:

在網頁使用的css檔案,js檔案和圖片叫做靜態檔案。

設定流程:
  1. 在項目目錄中建立static檔案夾
  2. 在建立的檔案夾裡分別建立js,css,img檔案夾
  3. 在setting.py檔案中做以下配置
STATICFILES_DIRS = [os.path.join(BASE_DIR, ‘static‘)]  # 設定靜態檔案的物理地址
  1. 設定靜態檔案路徑
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限制瀏覽器的使用者訪問伺服器

自訂中介軟體類
  1. 在應用的目錄裡面建立middleware.py
  2. 在該檔案當中建立中介軟體類-->類裡面建立中介軟體函數
  3. 在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上傳照片配置上傳圖片過程:
  • 在setting.py裡面做以下配置:
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中輔助技術總結[靜態檔案,中介軟體,上傳圖片,分頁案例]

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.