日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Django静态文件处理、中间件及Admin站点

發布時間:2024/4/11 编程问答 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Django静态文件处理、中间件及Admin站点 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

Django靜態文件處理、中間件及Admin站點

文章目錄

  • Django靜態文件處理、中間件及Admin站點
    • 一、靜態文件
      • 1.簡介
      • 2.示例
      • 3.配置靜態文件
    • 二、中間件
      • 1.簡介
      • 2.示例
      • 3.異常中間件
    • 三、Admin站點
      • 1.簡介
      • 2.控制管理頁展示
      • 3.列表頁選項
      • 4.編輯頁選項
      • 5.重寫模板

一、靜態文件

1.簡介

  • 項目中的CSS、圖片、js都是靜態文件。
  • 一般會將靜態文件放到一個單獨的目錄中,以方便管理。
  • 在html頁面中調用時,也需要指定靜態文件的路徑,Django中提供了一種解析的方式配置靜態文件路徑。
  • 靜態文件可以放在項目根目錄下,也可以放在應用的目錄下,由于有些靜態文件在項目中是通用的,所以推薦放在項目的根目錄下,方便管理。

2.示例

1)在test5/settings.py文件中定義靜態文件存放的物理目錄。

STATIC_URL = '/static/' STATICFILES_DIRS = [os.path.join(BASE_DIR, 'static'), ]

2)在項目根目錄下創建static目錄,再創建img、css、js目錄。

mkdir -p static/{img,css,js}

3)在booktest/views.py中定義視圖static_test。

def static_test(request):return render(request,'booktest/static_test.html')

4)在booktest/urls.py中配置url。

url(r'^static_test/$',views.static_test),

5)在templates/booktest/下創建static_test.html文件。

<html> <head><title>靜態文件</title> </head> <body> <img src="/static/img/sg.png"/> </body> </html>

6)保存圖片到static/img/目錄下,名稱為sg.png。

7)運行服務器,瀏覽效果如下圖:

3.配置靜態文件

Django提供了一種配置,可以在html頁面中可以隱藏真實路徑。

1)在test5/settings.py文件中修改STATIC_URL項。

# STATIC_URL = '/static/' STATIC_URL = '/abc/'

2)刷新瀏覽器,圖片找不到了,效果如下圖:

3)修改templates/booktest/static_test.html如下:

<html> <head><title>靜態文件</title> </head> <body> 修改前:<img src="/static/img/sg.png"/> <hr> 修改后:<img src="/abc/img/sg.png"/> </body> </html>

4)刷新瀏覽器,效果如下圖:

5)查看網頁源代碼,發現可以網址和真實地址之間沒有關系。

  • 為了安全可以通過配置項隱藏真實圖片路徑,在模板中寫成固定路徑,后期維護太麻煩,可以使用static標簽,根據配置項生成靜態文件路徑。

1)修改templates/booktest/static_test.html如下:

<html> <head><title>靜態文件</title> </head> <body> 修改前:<img src="/static/img/sg.png"/> <hr> 修改后:<img src="/abc/img/sg.png"/> <hr> 動態配置: {%load static from staticfiles%} <img src="{%static "img/sg.png" %}"/> </body> </html>

2)刷新瀏覽器,效果如下圖:

查看網頁源代碼如下圖:

  • 說明:這種方案可以隱藏真實的靜態文件路徑,但是結合Nginx布署時,會將所有的靜態文件都交給Nginx處理,而不用轉到Django部分,所以這項配置就無了

二、中間件

1.簡介

  • Django中的中間件是一個輕量級、底層的插件系統,可以介入Django的請求和響應處理過程,修改Django的輸入或輸出。
  • 中間件的設計為開發者提供了一種無侵入式的開發方式,增強了Django框架的健壯性,其它的MVC框架也有這個功能,名稱為IoC。
  • Django在中間件中預置了五個方法,這五個方法的區別在于不同的階段執行,對輸入或輸出進行干預,方法如下:
  • 1)初始化:無需任何參數,服務器響應第一個請求的時候調用一次,用于確定是否啟用當前中間件。
def __init__(self):pass
  • 2)處理請求前:在每個請求上,request對象產生之后,url匹配之前調用,返回None或HttpResponse對象。
def process_request(self, request):pass
  • 3)處理視圖前:在每個請求上,url匹配之后,視圖函數調用之前調用,返回None或HttpResponse對象。
def process_view(self, request, view_func, *view_args, **view_kwargs):pass
  • 4)處理響應后:視圖函數調用之后,所有響應返回瀏覽器之前被調用,在每個請求上調用,返回HttpResponse對象。
def process_response(self, request, response):pass
  • 5)異常處理:當視圖拋出異常時調用,在每個請求上調用,返回一個HttpResponse對象。
def process_exception(self, request,exception):pass

__init__:服務器響應第一個請求的時候調用。
process_request:是在產生request對象,進行url匹配之前調用。
process_view:是url匹配之后,調用視圖函數之前
process_response:視圖函數調用之后,內容返回給瀏覽器之前。
process_exception:視圖函數出現異常,會調用這個函數。
如果注冊的多個中間件類中包含process_exception函數的時候,調用的順序跟注冊的順序是相反的

2.示例

中間件是一個獨立的python類,,可以定義這五個方法中的一個或多個。

1)在booktest/目錄下創建middleware.py文件,代碼如下:

class my_mid:def __init__(self):print '--------------init'def process_request(self,request):print '--------------request'def process_view(self,request, view_func, *view_args, **view_kwargs):print '--------------view'def process_response(self,request, response):print '--------------response'return response

2)在test5/settings.py文件中,向MIDDLEWARE_CLASSES項中注冊。

3)修改booktest/views.py中視圖index。

def index(request):print '======index======'return render(request,'booktest/index.html')

4)運行服務器,命令行中效果如下圖:

5)刷新頁面,命令行中效果如下圖:

3.異常中間件

1)在booktest/middleware.py中定義兩個異常類如下:

class exp1:def process_exception(self,request,exception):print '--------------exp1' class exp2:def process_exception(self,request,exception):print '--------------exp2'

2)在test5/settings.py文件中,向MIDDLEWARE_CLASSES項中注冊。

3)修改booktest/views.py中視圖index。

def index(request):print '======index======'raise Exception('自定義異常')return render(request,'booktest/index.html')

總結:如果多個注冊的中間件類中都有process_exception的方法,則先注冊的后執行。
獲取瀏覽器端的ip地址
使用request對象的META屬性:request.META['REMOTE_ADDR']

三、Admin站點

1.簡介

內容發布的部分由網站的管理員負責查看、添加、修改、刪除數據,開發這些重復的功能是一件單調乏味、缺乏創造力的工作,為此,Django能夠根據定義的模型類自動地生成管理模塊。

在Django項目中默認啟用Admin管理站點。

1)準備工作:創建管理員的用戶名和密碼。

python manage.py createsuperuser

按提示填寫用戶名、郵箱、密碼。

2)使用:在應用的admin.py中注冊模型類

例:打開booktest/admin.py文件,注冊地區模型。

from django.contrib import admin from booktest.models import * admin.site.register(AreaInfo)

3)輸入如下網址:

http://127.0.0.1:8000/admin/

按提示填寫用戶名、密碼,點擊“Log in”按鈕登錄。

登錄成功后,可以看到AreaInfos,可以進行增加、修改、刪除、查詢的管理。

列表頁顯示效果如下圖:

2.控制管理頁展示

  • 類ModelAdmin可以控制模型在Admin界面中的展示方式,主要包括在列表頁的展示方式、添加修改頁的展示方式。

1)在booktest/admin.py中,注冊模型類前定義管理類AreaAdmin。

class AreaAdmin(admin.ModelAdmin):pass
  • 管理類有兩種使用方式:
  • 注冊參數
  • 裝飾器
  • 注冊參數:打開booktest/admin.py文件,注冊模型類代碼如下:
admin.site.register(AreaInfo,AreaAdmin)
  • 裝飾器:打開booktest/admin.py文件,在管理類上注冊模型類,代碼如下:
@admin.register(AreaInfo) class AreaAdmin(admin.ModelAdmin):pass

3.列表頁選項

  • 頁大小

每頁中顯示多少條數據,默認為每頁顯示100條數據,屬性如下:

list_per_page=100

1)打開booktest/admin.py文件,修改AreaAdmin類如下:

class AreaAdmin(admin.ModelAdmin):list_per_page = 10

2)在瀏覽器中查看區域信息的列表頁面,效果如下圖:

  • "操作選項"的位置

頂部顯示的屬性,設置為True在頂部顯示,設置為False不在頂部顯示,默認為True。

actions_on_top=True

底部顯示的屬性,設置為True在底部顯示,設置為False不在底部顯示,默認為False。

actions_on_bottom=False

1)打開booktest/admin.py文件,修改AreaAdmin類如下:

class AreaAdmin(admin.ModelAdmin):...actions_on_top = Trueactions_on_bottom = True

2)在瀏覽器中刷新效果如下圖:

  • 列表中的列

屬性如下:

list_display=[模型字段1,模型字段2,...]

1)打開booktest/admin.py文件,修改AreaAdmin類如下:

class AreaAdmin(admin.ModelAdmin): ... list_display = ['id','atitle']

2)在瀏覽器中刷新效果如下圖:

點擊列頭可以進行升序或降序排列

  • 將方法作為列

列可以是模型字段,還可以是模型方法,要求方法有返回值。

1)打開booktest/models.py文件,修改AreaInfo類如下:

class AreaInfo(models.Model):...def title(self):return self.atitle

2)打開booktest/admin.py文件,修改AreaAdmin類如下:

class AreaAdmin(admin.ModelAdmin):...list_display = ['id','atitle','title']

3)在瀏覽器中刷新效果如下圖:

方法列是不能排序的,如果需要排序需要為方法指定排序依據。

admin_order_field=模型類字段

1)打開booktest/models.py文件,修改AreaInfo類如下:

class AreaInfo(models.Model):...def title(self):return self.atitletitle.admin_order_field='atitle'

2)在瀏覽器中刷新效果如下圖:

  • 列標題
    列標題默認為屬性或方法的名稱,可以通過屬性設置。需要先將模型字段封裝成方法,再對方法使用這個屬性,模型字段不能直接使用這個屬性。
short_description='列標題'

1)打開booktest/models.py文件,修改AreaInfo類如下:

class AreaInfo(models.Model):...title.short_description='區域名稱'

2)在瀏覽器中刷新效果如下圖:

  • 關聯對象
    無法直接訪問關聯對象的屬性或方法,可以在模型類中封裝方法,訪問關聯對象的成員。

1)打開booktest/models.py文件,修改AreaInfo類如下:

class AreaInfo(models.Model):...def parent(self):if self.aParent is None:return ''return self.aParent.atitleparent.short_description='父級區域名稱'

2)打開booktest/admin.py文件,修改AreaAdmin類如下:

class AreaAdmin(admin.ModelAdmin):...list_display = ['id','atitle','title','parent']

3)在瀏覽器中刷新效果如下圖:

  • 右側欄過濾器
    屬性如下,只能接收字段,會將對應字段的值列出來,用于快速過濾。一般用于有重復值的字段。
list_filter=[]

1)打開booktest/admin.py文件,修改AreaAdmin類如下:

class AreaAdmin(admin.ModelAdmin):...list_filter=['atitle']

2)在瀏覽器中刷新效果如下圖:

  • 搜索框

屬性如下,用于對指定字段的值進行搜索,支持模糊查詢。列表類型,表示在這些字段上進行搜索。

search_fields=[]

1)打開booktest/admin.py文件,修改AreaAdmin類如下:

class AreaAdmin(admin.ModelAdmin):...search_fields=['atitle']

2)在瀏覽器中刷新效果如下圖:

  • 中文標題
    1)打開booktest/models.py文件,修改模型類,為屬性指定verbose_name參數,即第一個參數。
class AreaInfo(models.Model):atitle=models.CharField('標題',max_length=30)#名稱...

2)在瀏覽器中刷新效果如下圖:

4.編輯頁選項

  • 顯示字段順序

屬性如下:

fields=[]

1)點擊某行ID的鏈接,可以轉到修改頁面,默認效果如下圖:

2)打開booktest/admin.py文件,修改AreaAdmin類如下:

class AreaAdmin(admin.ModelAdmin):...fields=['aParent','atitle']

3)刷新瀏覽器效果如下圖:

在下拉列表中輸出的是對象的名稱,可以在模型類中定義str方法用于對象轉換字符串。

1)打開booktest/models.py文件,修改AreaInfo類,添加str方法。class AreaInfo(models.Model):...def __str__(self):return self.atitle

2)刷新瀏覽器效果如下圖:

  • 分組顯示

屬性如下:

fieldset=(('組1標題',{'fields':('字段1','字段2')}),('組2標題',{'fields':('字段3','字段4')}), )

1)打開booktest/admin.py文件,修改AreaAdmin類如下:

class AreaAdmin(admin.ModelAdmin):...# fields=['aParent','atitle']fieldsets = (('基本', {'fields': ['atitle']}),('高級', {'fields': ['aParent']}))

2)刷新瀏覽器效果如下圖:

說明:fields與fieldsets兩者選一使用。

  • 關聯對象

在一對多的關系中,可以在一端的編輯頁面中編輯多端的對象,嵌入多端對象的方式包括表格、塊兩種。 類型InlineModelAdmin:表示在模型的編輯頁面嵌入關聯模型的編輯。子類TabularInline:以表格的形式嵌入。子類StackedInline:以塊的形式嵌入。

1)打開booktest/admin.py文件,創建AreaStackedInline類。

class AreaStackedInline(admin.StackedInline):model = AreaInfo#關聯子對象extra = 2#額外編輯2個子對象

2)打開booktest/admin.py文件,修改AreaAdmin類如下:

class AreaAdmin(admin.ModelAdmin):...inlines = [AreaStackedInline]

3)刷新瀏覽器效果如下圖:

  • 可以用表格的形式嵌入。

1)打開booktest/admin.py文件,創建AreaTabularInline類。

class AreaTabularInline(admin.TabularInline):model = AreaInfo#關聯子對象extra = 2#額外編輯2個子對象

2)打開booktest/admin.py文件,修改AreaAdmin類如下:

class AreaAdmin(admin.ModelAdmin):...inlines = [AreaTabularInline]

3)刷新瀏覽器效果如下圖:

5.重寫模板

1)在templates/目錄下創建admin目錄,結構如下圖:

2)打開當前虛擬環境中Django的目錄,再向下找到admin的模板,目錄如下:

/home/python/.virtualenvs/py_django/lib/python3.5/site-packages/django/contrib/admin/templates/admin

3)將需要更改文件拷貝到第一步建好的目錄里,此處以base_site.html為例。

編輯base_site.html文件:

{% extends "admin/base.html" %}{% block title %}{{ title }} | {{ site_title|default:_('Django site admin') }}{% endblock %}{% block branding %} <h1 id="site-name"><a href="{% url 'admin:index' %}">{{ site_header|default:_('Django administration') }}</a></h1> <hr> <h1>自定義的管理頁模板</h1> <hr> {% endblock %}{% block nav-global %}{% endblock %}

4)在瀏覽器中轉到列表頁面,刷新后如下圖:


其它后臺的模板可以按照相同的方式進行修改。

總結

以上是生活随笔為你收集整理的Django静态文件处理、中间件及Admin站点的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。