Warning: error_log(/data/www/wwwroot/hmttv.cn/caches/error_log.php): failed to open stream: Permission denied in /data/www/wwwroot/hmttv.cn/phpcms/libs/functions/global.func.php on line 537 Warning: error_log(/data/www/wwwroot/hmttv.cn/caches/error_log.php): failed to open stream: Permission denied in /data/www/wwwroot/hmttv.cn/phpcms/libs/functions/global.func.php on line 537
jango的模板系統(tǒng)是Web應(yīng)用開發(fā)中重要的一環(huán),它使我們能夠?qū)?dòng)態(tài)數(shù)據(jù)與靜態(tài)模板進(jìn)行分離,從而實(shí)現(xiàn)更好的代碼維護(hù)性和可重用性。本文將解析Django模板系統(tǒng)實(shí)現(xiàn)機(jī)制,以及一些性能優(yōu)化策略,幫助你更好地理解和使用Django的模板系統(tǒng)。
Django模板系統(tǒng)允許我們?cè)谀0逯星度雱?dòng)態(tài)數(shù)據(jù),并通過模板引擎將模板與數(shù)據(jù)進(jìn)行渲染,最終生成HTML等格式的靜態(tài)頁面。模板系統(tǒng)使用特定的標(biāo)記和語法來表示動(dòng)態(tài)數(shù)據(jù)的插入和控制邏輯。
下面是一個(gè)簡(jiǎn)單的Django模板示例:
<!DOCTYPE html>
<html>
<head>
<title>{{ title }}</title>
</head>
<body>
<h1>Hello, {{ user.username }}!</h1>
<ul>
{% for item in items %}
<li>{{ item }}</li>
{% endfor %}
</ul>
</body>
</html>
在上面的例子中,我們使用雙花括號(hào){{ }}來表示要插入的動(dòng)態(tài)數(shù)據(jù),使用{% %}來表示控制邏輯(如循環(huán)、條件判斷等)。
Django模板渲染的實(shí)現(xiàn)機(jī)制可以分為以下幾個(gè)步驟:
模板渲染涉及對(duì)模板內(nèi)容的解析和動(dòng)態(tài)數(shù)據(jù)的替換,因此在性能方面需要考慮一些優(yōu)化策略。
為了避免在每次渲染時(shí)都重新解析模板,我們可以將模板對(duì)象緩存起來。Django的模板引擎會(huì)自動(dòng)進(jìn)行模板對(duì)象的緩存,默認(rèn)情況下使用內(nèi)存緩存。這樣可以顯著提高模板渲染的性能,特別是當(dāng)模板較大或模板加載頻繁時(shí)。
在渲染模板時(shí),可能需要從數(shù)據(jù)庫中獲取動(dòng)態(tài)數(shù)據(jù)。在進(jìn)行數(shù)據(jù)庫查詢時(shí),我們可以使用select_related和prefetch_related方法來優(yōu)化查詢性能。這些方法可以減少數(shù)據(jù)庫查詢的次數(shù),提高查詢效率。
在模板中,盡量避免復(fù)雜的邏輯和嵌套,因?yàn)槟0鍢?biāo)簽和邏輯會(huì)增加解析和渲染的時(shí)間。簡(jiǎn)化模板結(jié)構(gòu)有助于提高模板渲染的效率。
對(duì)于一些計(jì)算量較大或數(shù)據(jù)更新不頻繁的動(dòng)態(tài)數(shù)據(jù),可以使用緩存機(jī)制來緩存渲染結(jié)果,從而避免重復(fù)渲染。Django提供了緩存框架,可以方便地實(shí)現(xiàn)緩存策略。
本文解析了Django模板系統(tǒng)的實(shí)現(xiàn)機(jī)制,并介紹了一些性能優(yōu)化策略。通過了解模板渲染的流程和性能優(yōu)化方法,我們可以更好地利用Django模板系統(tǒng)來開發(fā)高效的Web應(yīng)用。
昨晚應(yīng)該是睡的最好一天吧,最近一個(gè)月睡眠好差,睡不著不說,而且半夜總醒,搞的我第二天就會(huì)超沒精神。
昨天下午去姐姐家,我剛進(jìn)屋,小外甥直接就問我說:
老舅,你都很長(zhǎng)時(shí)間沒來啦,**(前女友)哪去了, 我們都好久沒出溜溜了!
我頓了下說,她不喜歡我們了,等以后天暖和,我們?cè)偃チ锪铩?/span>
才發(fā)現(xiàn),忘掉一個(gè)人真的很難,明知道沒結(jié)果,還是沒法輕易做到波瀾不驚,不去想念。
視圖: 瀏覽器窗口展示出來的頁面內(nèi)容,就是視圖。 html頁面: 在頁面上展示出的純文本內(nèi)容,打開的瀏覽器頁面,就是html頁面
python manage.py startapp mycontent
在setting.py文件中,找到INSTALLED_APPS,并在最后一行添加如下內(nèi)容:
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'mycontent',
]
在新建的應(yīng)用下創(chuàng)建templates模板文件夾,在模板下創(chuàng)建content.html,代碼如下:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>content demo</title>
</head>
<body>
<h3>this is a content</h3>
</body>
</html>
接下來,需要將html與url綁定,啥意思,就是你訪問url連接可以看到你剛才的html文件內(nèi)容。 我們需要在mycontent/views.py里寫視圖函數(shù)添加如下代碼:
from django.shortcuts import render
# Create your views here.
from django.shortcuts import render
from django.http import HttpResponse
# Create your views here.
def index(request):
return HttpResponse("Hello world ! django ~~")
def my_content(request):
return render(request, 'content.html')
在django_project/urls.py里添加url訪問路徑,示例代碼如下:
from django.conf.urls import url
from mycontent import views
urlpatterns = [
url('^$', views.index),
url('^my_content', views.my_content())
]
訪問http://127.0.0.1:8000/my_content可以看到效果如下:
主要有三個(gè):path、re_path、url:
從path()和re_path()源碼看,path()的匹配規(guī)則是RoutePattern, re_path()匹配規(guī)則是RegexPattern
path = partial(_path, Pattern=RoutePattern)
re_path = partial(_path, Pattern=RegexPattern)
url()源碼,也是使用的re_path()
def url(regex, view, kwargs=None, name=None):
return re_path(regex, view, kwargs, name)
沿用博主的案例吧,就是分頁跳轉(zhuǎn)的例子,不能動(dòng)態(tài)寫死,只需要用正則表達(dá)式匹配數(shù)字即可,匹配任意數(shù)字,可以用正則\d+匹配,如下所示:
url('^pagehelper=\d+$', views.pagehelper)
模擬場(chǎng)景就是,傳入非數(shù)字類型參數(shù)返回404 Not Found,在mycontent/views.py修改代碼如下:
# Create your views here.
from django.http import HttpResponse, Http404
from django.shortcuts import render
# Create your views here.
def index(request):
return HttpResponse("Hello world ! django ~~")
def my_content(request):
return render(request, 'content.html')
def pagehelper(request,num):
try:
num=int(num)
return render(request, 'content.html')
except:
raise Http404
在django_project/urls.py里添加url訪問路徑,示例代碼如下:
from django.conf.urls import url
from django.urls import re_path, path
from mycontent import views
urlpatterns = [
path("index/", views.index),
re_path('^$', views.index),
url('^$', views.index),
url('^my_content/$', views.my_content),
url('^my_content/page=(\d+)$', views.pagehelper),
]
效果:
這個(gè)報(bào)錯(cuò),主要是因?yàn)?/span>Django設(shè)置文件setting.py里面有個(gè)參數(shù) DEBUG = True,將其更改為False,Django將顯示標(biāo)準(zhǔn)的404頁面。
默認(rèn)顯示如下:
知識(shí)點(diǎn):
效果如下:
一段感情開始容易,結(jié)束卻很難,它不是今天和明天的一刀切,分開了就是兩條路,它是過往習(xí)慣的終結(jié),是愛過但也不再愛的承認(rèn),是一個(gè)人面對(duì)未知的勇氣,是從此一別兩寬、各生歡喜。
如果可以,我也想這么釋然,放過自己,不再這么內(nèi)耗自己了。
個(gè)銷售管理系統(tǒng),由基礎(chǔ)數(shù)據(jù)、員工信息、客戶管理、產(chǎn)品管理、銷售統(tǒng)計(jì)等功能組成,你若想一個(gè)人輕輕松松地開發(fā)完成,那我建議你采用Django3.0。
Django3.0用命令即可生成麻雀雖小五臟俱全的項(xiàng)目文件sales(系統(tǒng)架構(gòu)),還可用命令生成功能模塊(base),程序員可通過配置項(xiàng)目文件,將功能模塊組合在一起。欲開發(fā)功能,先熟悉項(xiàng)目文件。
兩個(gè)sales文件,外層的sales,是存放項(xiàng)目?jī)?nèi)容的文件夾,這個(gè)名稱可以隨意更改,只要你喜歡就行。內(nèi)層sales包含的settings.py、urls.py等文件,加上manage.py,便是Django的系統(tǒng)框架了。
__init__.py:內(nèi)容一般是空的,常用來聲明(它)所在之處的文件夾(sales)是個(gè)包;
settings.py:包括了項(xiàng)目的初始化設(shè)置,對(duì)整個(gè)項(xiàng)目進(jìn)行相關(guān)配置,比如數(shù)據(jù)庫連接參數(shù)、添加應(yīng)用等;
asgi.py:構(gòu)建異步Web界面和處理雙向協(xié)議的新方式,是Django3.0版本新出的異步功能;
urls.py:url地址秀,網(wǎng)站目錄,配置簡(jiǎn)單容易理解,可把用戶在瀏覽器中發(fā)出的請(qǐng)求,映射到指定的應(yīng)用程序上;
wsgi.py:告訴中間件(Apache或nginx):幫我運(yùn)行Django開發(fā)的項(xiàng)目吧,我滴乖乖。開發(fā)過程中很少用到;
templates:存放HTML模板文件;
manage.py:Django的任務(wù)管理命令行工具。可用來生成數(shù)據(jù)庫遷移文件,同步表結(jié)構(gòu),生成App等,是項(xiàng)目中的管家。
在項(xiàng)目(sales)中的應(yīng)用base,實(shí)際上是我們接下來要開發(fā)實(shí)現(xiàn)的銷售管理系統(tǒng)中的基礎(chǔ)數(shù)據(jù)功能模塊來的。在base下的文件,無論你想不想都要搞清楚。
migration:存放數(shù)據(jù)表結(jié)構(gòu)的指令文件,通過它們可以修改和創(chuàng)建數(shù)據(jù)庫,從而在models.py模型類和數(shù)據(jù)庫表之間進(jìn)行遷移;
__init__.py:內(nèi)容有時(shí)不是空的,它來聲明base文件夾是個(gè)包;
admin.py:應(yīng)用的連接,配置model,連接Form,聲明在Django自帶的后臺(tái)管理系統(tǒng);
apps.py:通常里面包含對(duì)應(yīng)用的配置,如應(yīng)用名稱;
models.py:實(shí)體類定義,會(huì)生成對(duì)應(yīng)的數(shù)據(jù)庫表結(jié)構(gòu)。同時(shí)還具備操作數(shù)據(jù)庫的能力(API),省去手動(dòng)編寫增刪改查的重復(fù)工作;
tests.py:?jiǎn)卧獪y(cè)試工具,可以編寫測(cè)試文檔來測(cè)試所建立的應(yīng)用;
views.py:雖然從名字上看是視圖的意思,實(shí)際上是邏輯控制用的,同web頁面交互,與models交流,協(xié)調(diào)整個(gè)系統(tǒng)有條不紊的動(dòng)作。
一個(gè)軟件產(chǎn)品,在進(jìn)入開發(fā)階段時(shí),會(huì)先進(jìn)行系統(tǒng)分析,分析的結(jié)果,最少包含3方面的內(nèi)容(實(shí)際上肯定不止),有數(shù)據(jù)庫表結(jié)構(gòu)(或?qū)嶓w類)、有業(yè)務(wù)流程圖,還有界面效果圖,而這三方面一般是由不同的人負(fù)責(zé)的。
專業(yè)的人做專業(yè)的事,才能提高工作效率,才能把活干得更好。再說,一個(gè)人拿一份工資,也不愿意干幾份活呀。正因?yàn)榇耍琈VC, 模型(model)-視圖(view)-控制器(controller)模式運(yùn)勢(shì)而生。
M(模型,Model):對(duì)數(shù)據(jù)邏輯內(nèi)容進(jìn)行處理,對(duì)數(shù)據(jù)庫表中的數(shù)據(jù)進(jìn)行增刪改查操作。一般由程序猿負(fù)責(zé)開發(fā)實(shí)現(xiàn),不一般的話,由老板自己完成,那還請(qǐng)你做什么?實(shí)體類(或表結(jié)構(gòu))由DBA設(shè)計(jì),如果有這個(gè)崗位的話。
V(視圖,View):處理數(shù)據(jù)顯示(在界面上)的職責(zé)。由設(shè)計(jì)師負(fù)責(zé),他們經(jīng)常會(huì)對(duì)界面進(jìn)行設(shè)計(jì)、設(shè)計(jì)、再設(shè)計(jì)。
C(控制器, controller):從視圖讀取數(shù)據(jù),控制用戶輸入,向模型發(fā)送數(shù)據(jù)并最終導(dǎo)向視圖(進(jìn)行展示)。也是程序猿負(fù)責(zé),這就是導(dǎo)致他們禿頂?shù)脑蛑弧?/p>
現(xiàn)在幾乎所有Web框架都基于MVC模式而設(shè)計(jì),Django也不例外。只是為了彰顯不同的地位,Django特意采用了MVT模式。
MVT實(shí)際上和MVC是一致的,其中M是Model(模型),V(Views)是控制器,而T(templates)相當(dāng)月MVC中的V,換湯不換藥,只是叫法不同而已。
在Django框架中,文件雖然不多,但完全有必要搞清楚它們的運(yùn)行機(jī)制,否則開發(fā)了大半天的功能,還說不清道不明子丑寅卯的話,是會(huì)被人笑掉大牙的。
用戶通過瀏覽器訪問應(yīng)用系統(tǒng),中間件接受到請(qǐng)求之后,判斷其訪問的地址,接著:
1. 調(diào)用Django通過在ROOT_URLCONF配置來決定根URLconf;
2. Django在URLconf中的所有URL模式中,查找第一個(gè)匹配/地址/的條目;
3. 如果找到匹配,將調(diào)用相應(yīng)的視圖函數(shù);
4. 視圖函數(shù)返回一個(gè)HttpResponse;
5. Django轉(zhuǎn)換HttpResponse為一個(gè)適合的HTTP response,以Web page顯示出來。
好了,有關(guān)Djangon3.0項(xiàng)目詳解的內(nèi)容,老陳講完了,下一節(jié)進(jìn)入Django開發(fā)流程。如果覺得對(duì)你有所幫助,希望老鐵能轉(zhuǎn)發(fā)點(diǎn)贊,讓更多的人看到這篇文章。你的轉(zhuǎn)發(fā)和點(diǎn)贊,就是對(duì)老陳繼續(xù)創(chuàng)作和分享最大的鼓勵(lì)。
一個(gè)當(dāng)了10年技術(shù)總監(jiān)的老家伙,分享多年的編程經(jīng)驗(yàn)。想學(xué)編程的朋友,可關(guān)注:老陳說編程。我在分享Python,前端、Java和App方面的干貨。關(guān)注我,沒錯(cuò)的。
#Python##Django##程序員##Web##項(xiàng)目實(shí)戰(zhàn)#
*請(qǐng)認(rèn)真填寫需求信息,我們會(huì)在24小時(shí)內(nèi)與您取得聯(lián)系。