• <noscript id="e0iig"><kbd id="e0iig"></kbd></noscript>
  • <td id="e0iig"></td>
  • <option id="e0iig"></option>
  • <noscript id="e0iig"><source id="e0iig"></source></noscript>
  • Django Web框架02

    標簽: Django  django

    《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

    • 什么是模板

      1. 模板是可以根據字典數據動態變化的html網頁
      2. 模板可以根據視圖中傳遞的字典數據動態生成相應的HTML網頁。
    • 模板的配置

      • 創建模板文件夾<項目名>/templates

      • 在 settings.py 中 TEMPLATES 配置項

        1. BACKEND : 指定模板的引擎

          引擎的作用就是將視圖傳遞給模板的字典格式數據顯示出來.引擎從本質

        上是Django框架的一個組件.

        1. DIRS : 模板的搜索目錄(可以是一個或多個)

        2. APP_DIRS : 是否要在應用中的 templates 文件夾中搜索模板文件

        3. 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目錄
            ...
        },
    ]
    
    1. 模板的加載方式
      1. 通過 loader 獲取模板,通過HttpResponse進行響應
        from django.template import loader
        # 1.通過loader加載模板
        t = loader.get_template("模板文件名")
        # 2.將t轉換成 HTML 字符串
        html = t.render(字典數據)
        # 3.用響應對象將轉換的字符串內容返回給瀏覽器
        return HttpResponse(html)
        
      2. 使用 render() 直接加載并響應模板
        from django.shortcuts import render
        return render(request,'模板文件名', 字典數據)
        

    Django 模板語言

    模板的傳參

    • 模板傳參是指把數據形成字典,傳參給模板,為模板渲染提供數據
    1. 使用 loader 加載模板
      t = loader.get_template('xxx.html')
      html = t.render(字典數據)
      return HttpResponse(html)
      
    2. 使用render加載模板
      return render(request,'xxx.html',字典數據)
      

    模板的變量

    1. 在模板中使用變量語法
      • {{ 變量名 }}

      • {{ 變量名.index }} #列表和元祖

      • {{ 變量名.key}} #字典

      • {{ 對象.方法 }}

      • {{ 函數名 }}

    2.視圖函數中必須將變量封裝到字典中才允許傳遞到模板上

    def xxx_view(request)
        dic = {
            "變量1":"值1",
            "變量2":"值2",
        }
        return render(request, 'xxx.html', dic)
    
    1. 如果變量過多,可以使用 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

    1. 作用

      • 將一些服務器端的功能嵌入到模板中
    2. 標簽語法

      {% 標簽 %}
      ...
      {% 結束標簽 %}
      
    3. if 標簽

      {% if 條件表達式1 %}
      ...
      {% elif 條件表達式2 %}
      ...
      {% elif 條件表達式3 %}
      ...
      {% else %}
      ...
      {% endif %}
      
    4. 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>
      
    5. for 標簽

      1. 語法
        {% for 變量 in 可迭代對象 %}
            ... 循環語句
        {% empty %}
            ... 可迭代對象無數據時填充的語句
        {% endfor %}
        
      2. 內置變量 - forloop
        變量描述
        forloop.counter循環的當前迭代(從1開始索引)
        forloop.counter0循環的當前迭代(從0開始索引)
        forloop.revcountercounter值得倒序
        forloop.revcounter0revcounter值的倒序
        forloop.first如果這是第一次通過循環,則為真
        forloop.last如果這是最后一次循環,則為真
        forloop.parentloop當嵌套循環,parentloop 表示外層循環

    過濾器

    1. 作用

      • 在變量輸出時對變量的值進行處理
      • 可以通過使用 過濾器來改變變量的輸出顯示。
    2. 語法

      • {{ 變量|過濾器1:參數值1|過濾器2:參數值2 … }}
    3. 常用的過濾器

      過濾器說明
      lower將字符串轉換為全部小寫。
      upper將字符串轉換為大寫形式
      safe默認不對變量內的字符串進行html轉義
      add: “n”將value的值增加 n
      truncatechars:‘n’如果字符串字符多于指定的字符數量,那么會被截斷。 截斷的字符串將以可翻譯的省略號序列(“…”)結尾。
    4. 文檔參見:

    模板的繼承

    • 模板繼承可以使父模板的內容重用,子模板直接繼承父模板的全部內容并可以覆蓋父模板中相應的塊

    • 定義父模板中的塊 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信息
      • 在模板中 ->通過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}))
        

        同名找最合適的【參數一致的】;參數一致時,找最后一個;

      
      
    版權聲明:本文為qq_41302958原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處鏈接和本聲明。
    本文鏈接:https://blog.csdn.net/qq_41302958/article/details/109262549

    智能推薦

    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的命令行工具...

    猜你喜歡

    HTML中常用操作關于:頁面跳轉,空格

    1.頁面跳轉 2.空格的代替符...

    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壓縮包 那我們就開始做吧 首先,查看網頁的源代碼,我們可以看到每一...

    精品国产乱码久久久久久蜜桃不卡