Django Web框架02
《Django Web框架》
目錄
文章目錄
Django的框架設計模式
- MVC 設計模式
- MVC 代表 Model-View-Controller(模型-視圖-控制器) 模式。
- 作用: 降低模塊間的耦合度(解耦)
- MVC
- M 模型層(Model), 主要用于對數據庫層的封裝
- V 視圖層(View), 用于向用戶展示結果
- C 控制(Controller ,用于處理請求、獲取數據、返回結果(重要)
- MVC模式如圖:
- MTV 模式
MTV 代表 Model-Template-View(模型-模板-視圖) 模式。這種模式用于應用程序的分層開發- 作用:
- 降低模塊間的耦合度(解耦)
- MTV
- M – 模型層(Model) 負責與數據庫交互
- T – 模板層(Template) 負責呈現內容到瀏覽器
- V – 視圖層(View) 是核心,負責接收請求、獲取數據、返回結果
- MTV模式如圖:
- 作用:
模板 Templates
-
什么是模板
- 模板是可以根據字典數據動態變化的html網頁
- 模板可以根據視圖中傳遞的字典數據動態生成相應的HTML網頁。
-
模板的配置
-
創建模板文件夾
<項目名>/templates
-
在 settings.py 中 TEMPLATES 配置項
-
BACKEND : 指定模板的引擎
引擎的作用就是將視圖傳遞給模板的字典格式數據顯示出來.引擎從本質
上是Django框架的一個組件.
-
DIRS : 模板的搜索目錄(可以是一個或多個)
-
APP_DIRS : 是否要在應用中的
templates
文件夾中搜索模板文件 -
OPTIONS : 有關模板的選項
-
-
-
默認的模塊文件夾
templates
-
修改settings.py文件,設置TEMPLATES的DIRS值為
'DIRS': [os.path.join(BASE_DIR, 'templates')],
# file: settings.py
TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
# 'DIRS': [],
'DIRS': [os.path.join(BASE_DIR, 'templates')], # 添加模板路徑
'APP_DIRS': True, # 是否索引各app里的templates目錄
...
},
]
- 模板的加載方式
- 通過 loader 獲取模板,通過HttpResponse進行響應
from django.template import loader # 1.通過loader加載模板 t = loader.get_template("模板文件名") # 2.將t轉換成 HTML 字符串 html = t.render(字典數據) # 3.用響應對象將轉換的字符串內容返回給瀏覽器 return HttpResponse(html)
- 使用 render() 直接加載并響應模板
from django.shortcuts import render return render(request,'模板文件名', 字典數據)
- 通過 loader 獲取模板,通過HttpResponse進行響應
Django 模板語言
模板的傳參
- 模板傳參是指把數據形成字典,傳參給模板,為模板渲染提供數據
- 使用 loader 加載模板
t = loader.get_template('xxx.html') html = t.render(字典數據) return HttpResponse(html)
- 使用render加載模板
return render(request,'xxx.html',字典數據)
模板的變量
- 在模板中使用變量語法
-
{{ 變量名 }}
-
{{ 變量名.index }}
#列表和元祖 -
{{ 變量名.key}}
#字典 -
{{ 對象.方法 }}
-
{{ 函數名 }}
-
2.視圖函數中必須將變量封裝到字典中才允許傳遞到模板上
def xxx_view(request)
dic = {
"變量1":"值1",
"變量2":"值2",
}
return render(request, 'xxx.html', dic)
- 如果變量過多,可以使用 locals() 將局部變量自動生成字典
def xxx_view(request)
變量1 = 值1
變量2 = 值2
...
return render(request, 'xxx.html', locals())
XSS攻擊
定義:XSS全稱是Cross Site Scripting即跨站腳本
原理:將惡意HTML/JavaScript代碼注入到受害用戶瀏覽的網頁上,從而達到攻擊目的
危害:盜取用戶信息,破壞網站正常運行等
分類:
反射型xss
? 定義:發出請求時,XSS代碼出現在URL中,作為輸入提交到服務器端,服務器端解析后響應,XSS代碼隨響應內容一起傳回給瀏覽器,最后瀏覽器解析執行XSS代碼。這個過程像一次反射,故叫反射型XSS
樣例:
以查詢字符串形式提交 xss代碼
http://127.0.0.1:8000/test_html?t=<script>alert(11)</script>
后端接到查詢字符串的值后,顯示在頁面中
存儲型xss
? 定義:提交的XSS代碼會存儲在服務器端(數據庫,內存,文件系統等),其他用戶請求目標頁面時即被攻擊
樣例:
博客發表文章時,提交XSS代碼,服務器存儲代碼后,其他用戶訪問該文章時,被XSS攻擊
DOM xss
? 定義:DOM XSS的代碼無需跟服務器交互,在前端直接觸發攻擊
樣例:
地址欄提交#內容,例如-http://127.0.0.1:8000/test_html#javascript:alert(11)
頁面中添加JS:
<script>
var hash = location.hash;
if(hash){
var url = hash.substring(1);
location.href = url;
}
</script>
防范XSS攻擊的唯一有效方式就是轉義
In [1]: import html
In [2]: script = ‘’
In [3]: content = html.escape(script)
In [4]: content
Out[4]: ‘<script>alert(110)</script>’
In [5]: s = html.unescape(content)
In [6]: s
Out[6]: ‘’
模板的標簽
文檔可參見:https://docs.djangoproject.com/en/2.2/ref/templates/builtins/#built-in-tag-reference
-
作用
- 將一些服務器端的功能嵌入到模板中
-
標簽語法
{% 標簽 %} ... {% 結束標簽 %}
-
if 標簽
{% if 條件表達式1 %} ... {% elif 條件表達式2 %} ... {% elif 條件表達式3 %} ... {% else %} ... {% endif %}
-
if 標簽里的布爾運算符
- if 條件表達式里可以用的運算符 ==, !=, <, >, <=, >=, in, not in, is, is not, not、and、or
- 在if標記中使用實際括號是無效的語法。 如果您需要它們指示優先級,則應使用嵌套的if標記。
練習
-
寫一個簡單的計算器頁面,能夠在服務端進行簡單加減乘除計算
+加 -減 *乘 /除 = 3 -
參考代碼
<form action='/mycal' method='POST'> <input type='text' name="x" value="1"> <select name='op'> <option value="add"> +加 </option> <option value="sub"> -減 </option> <option value="mul"> *乘 </option> <option value="div"> /除 </option> </select> <input type='text' name="y" value="2"> = <span>3</span> <div> <input type="submit" value='開始計算'> </div> </form>
-
for 標簽
- 語法
{% for 變量 in 可迭代對象 %} ... 循環語句 {% empty %} ... 可迭代對象無數據時填充的語句 {% endfor %}
- 內置變量 - forloop
變量 描述 forloop.counter 循環的當前迭代(從1開始索引) forloop.counter0 循環的當前迭代(從0開始索引) forloop.revcounter counter值得倒序 forloop.revcounter0 revcounter值的倒序 forloop.first 如果這是第一次通過循環,則為真 forloop.last 如果這是最后一次循環,則為真 forloop.parentloop 當嵌套循環,parentloop 表示外層循環
- 語法
過濾器
-
作用
- 在變量輸出時對變量的值進行處理
- 可以通過使用 過濾器來改變變量的輸出顯示。
-
語法
- {{ 變量|過濾器1:參數值1|過濾器2:參數值2 … }}
-
常用的過濾器
過濾器 說明 lower 將字符串轉換為全部小寫。 upper 將字符串轉換為大寫形式 safe 默認不對變量內的字符串進行html轉義 add: “n” 將value的值增加 n truncatechars:‘n’ 如果字符串字符多于指定的字符數量,那么會被截斷。 截斷的字符串將以可翻譯的省略號序列(“…”)結尾。 … -
文檔參見:
模板的繼承
-
模板繼承可以使父模板的內容重用,子模板直接繼承父模板的全部內容并可以覆蓋父模板中相應的塊
-
定義父模板中的塊
block
標簽- 標識出哪些在子模塊中是允許被修改的
- block標簽:在父模板中定義,可以在子模板中覆蓋
{% block block_name %} 定義模板塊,此模板塊可以被子模板重新定義的同名塊覆蓋 {% endblock block_name %}
-
繼承模板
extends
標簽(寫在模板文件的第一行)- 子模板繼承語法標簽
{% extends '父模板名稱' %}
- 如:
{% extends 'base.html' %}
- 子模板 重寫父模板中的內容塊
{% block block_name %} 子模板塊用來覆蓋父模板中 block_name 塊的內容 {% endblock block_name %}
- 重寫的覆蓋規則
- 不重寫,將按照父模板的效果顯示
- 重寫,則按照重寫效果顯示
- 注意
- 模板繼承時,服務器端的動態內容無法繼承
- 子模板繼承語法標簽
-
參考文檔
-
https://docs.djangoproject.com/en/2.2/ref/templates/language/#for-template-blocks
-
模板的繼承示例:
url 反向解析
-
url 反向解析是指在視圖或模板中,用path定義的名稱來查找或計算出相應的路由
-
path 函數的語法
-
path (route, views, name=“別名”)
-
例如:
-
path(‘page’, views.page_view, name=“page_url”)
第一個參數是url,然后第三個參數給這個url起一個名字.由url->名字 是正向.然后在使用url時,不是直接使用url字符串,而是使用它的名字.內部需要根據名字->url 有名字->值 稱為反向.[名字相當于變量名,url相當于變量值]
-
-
path() 的
name
關鍵字參數-
作用:
- 根據path中的
name=
關鍵字傳參給 url確定了個唯一確定的名字,在模板或視圖中,可以通過這個名字反向推斷出此url信息
- 根據path中的
-
在模板中 ->通過url標簽實現地址的反向解析
{% url '別名' %} {% url '別名' '參數值1' '參數值2' %} ex: {% url 'pagen' '400' %} {% url 'person' age='18' name='gxn' %}
-
在視圖函數中 ->可調用 django中的 reverse 方法進行反向解析
from django.urls import reverse reverse('別名', args=[], kwargs={}) ex: print(reverse('pagen',args=[300])) print(reverse('person',kwargs={'name':'xixi','age':18}))
同名找最合適的【參數一致的】;參數一致時,找最后一個;
-
智能推薦
web框架-(三)Django進階
通過上節課的學習,我們已經對Django有了簡單的了解,現在來深入了解下~ 1. 路由系統 1.1 單一路由對應 1.2 基于正則的路由 找到urls.py文件,修改路由規則 在views.py文件創建對應方法 1.3 url分組 在url.py增加對應路徑 在views.py文件創建對應方法 1.4 為路由映射名稱 在templates目錄下的index.html 1.5 根據app對路由分類 ...
python--web框架:Django
Django Python下有許多款不同的 Web 框架,如: Django、Tornado、Flask 等多種. Django是重量級選手中最有代表性的一位。許多成功的網站和APP都基于Django。Dja...
django-web框架調研
什么是django? Django is a high-level Python Web framework that encourages rapid development and clean, pragmatic design. Built by experienced developers, it takes care of much of the hassle of Web develo...
web框架-Django簡介1
一.什么是web框架(framework)–本質是一個socket 是一種開發框架(解決一個開放性設計問題設計的具有一定約束性的支撐結構),用來支持動態網站、網絡應用程序及網絡服務的開發。其類型有基于請求的和基于組件的兩種框架 二.web應用的流程 1.瀏覽器發送一個http請求 2.服務器接收到請求,生成一個html文檔 3.服務器把html文檔當做http響應的body發送給瀏覽器...
Python Web編程 Django框架
一.Django的流程和命令行工具 1個Djongo項目的結構: 1.Django實現流程: url.py:jianshu.com/p/2fbafbddf4d2 Django每次修改,自動重啟 index.html: 2.Django的命令行工具...
猜你喜歡
freemarker + ItextRender 根據模板生成PDF文件
1. 制作模板 2. 獲取模板,并將所獲取的數據加載生成html文件 2. 生成PDF文件 其中由兩個地方需要注意,都是關于獲取文件路徑的問題,由于項目部署的時候是打包成jar包形式,所以在開發過程中時直接安照傳統的獲取方法沒有一點文件,但是當打包后部署,總是出錯。于是參考網上文章,先將文件讀出來到項目的臨時目錄下,然后再按正常方式加載該臨時文件; 還有一個問題至今沒有解決,就是關于生成PDF文件...
電腦空間不夠了?教你一個小秒招快速清理 Docker 占用的磁盤空間!
Docker 很占用空間,每當我們運行容器、拉取鏡像、部署應用、構建自己的鏡像時,我們的磁盤空間會被大量占用。 如果你也被這個問題所困擾,咱們就一起看一下 Docker 是如何使用磁盤空間的,以及如何回收。 docker 占用的空間可以通過下面的命令查看: TYPE 列出了docker 使用磁盤的 4 種類型: Images:所有鏡像占用的空間,包括拉取下來的鏡像,和本地構建的。 Con...
requests實現全自動PPT模板
http://www.1ppt.com/moban/ 可以免費的下載PPT模板,當然如果要人工一個個下,還是挺麻煩的,我們可以利用requests輕松下載 訪問這個主頁,我們可以看到下面的樣式 點每一個PPT模板的圖片,我們可以進入到詳細的信息頁面,翻到下面,我們可以看到對應的下載地址 點擊這個下載的按鈕,我們便可以下載對應的PPT壓縮包 那我們就開始做吧 首先,查看網頁的源代碼,我們可以看到每一...