Django學習筆記

基礎指令

  • 創建Django項目
    • django-admin startproject 項目名稱
  • 創建APP
    • python manage.py startapp app名稱
    • 在項目setting中註冊APP,即直接將APP名稱寫入
    • 寫入路由
    • 寫入視圖
    • 創建自己的templates,並將其標記爲模板文件夾(右擊文件夾,make dictionary as -》template folder)
  • 運行Django項目
    • python manage.py runserver
      • 默認是127.0.0.1:8000
    • python manage.py runserver host:port
      • 指定運行的IP和端口

基礎配置

  • setting文件中配置網頁文件
    • 在TEMPLATES字典中,key爲DIRS的列表中添加
      • os.path.join(BASE_DIR,‘templates’)
  • setting文件中配置靜態文件
    • STATICFILES_DIRS={
      os.path.join(BASE_DIR,‘static’)
      }
  • 數據庫配置
    • init.py配置MySQL
      • import pymysql
      • pymysql.install_as_MySQLdb()
  • 路由配置
    • 項目邏輯過於複雜,可以進行拆分
    • 拆分成多個App
    • 繼續拆分路由器 urls,在第一個APP下的url中添加路由進行包含,如:url(r"^next/",include(‘app.urls’)),
      • 在App 中創建自己的urls
        • urlpatterns 路由規則列表
        • 在根urls中進行子路由包含
      • 子路由的使用
        • 根路由規則,子路由的規則

數據庫

  • ORM技術
    - object Relational Mapping    對象關係映射
    • 將業務邏輯進行一個解耦合

      • object.save()
      • object.delete()
    • 關係型數據庫

      • 通過models定義實現   數據庫的定義
    • 數據操作

      • 增刪改查
      • 存儲
        -save()
      • 查詢
        • 查所有 objects.all()
        • 查單個 objects.get(pk=xx)
      • 更新
        -基於查詢
        -查好的對象,修改屬性,然後save()
      • 刪除
        • delete()
    • 數據庫遷移

      • 生成遷移文件 (正向遷移)
        • python manage.py makemigrations
        • python manage.py migrate
      • sql -> model
        • python manage.py inspectdb
          • 可根據表生成模型
          • 元信息包含一個屬性 manage=False
        • python manage.py inspectdb>models.py
          • 可自動生成models.py文件
          • 自帶元信息
  • 連接本地MySQL
    • MySQLclient
      -python2,3都能直接使用
      -致命缺點
      -對MySQL的安裝有要求,必須指定位置存在配置文件
    • python-mysql
      • python2 支持很好
      • python3 不支持
    • pymysql
      • python2,python3都支持
      • 它還可以僞裝成前面的庫
  • 字段屬性
    • null
      • 如果爲True,django可以爲空值,默認爲False
    • blank
      • 如果爲True,該字段允許爲空白
    • db_colum
      • 字段的名稱,如果未指定,則使用屬性名稱
    • db_index
      • 若值爲True,則在表中爲該字段創建索引
    • default
      • 默認值
    • primary_key
      • 若爲True,則該字段會成爲模型的主鍵字段
    • unique
      • 如果爲True,這個字段在表中必須有唯一值
  • 模型過濾
    • filter
    • exclude
    • 連續使用
      • 鏈式調用
      • 表名.objects.filter(條件)   可多個filter
    • order by()
      • 排序
    • values()
      • 一條數據就是一個字典,返回一個列表
  • 查詢方法
    • get() 獲取數據
      • 查詢條件沒有匹配對象,拋出異常,DoesNotExist
      • 如果查詢條件對應多個對象,會跑出異常MultipleObjectsReturned
    • first()和last() 獲取第一個和最後一個數據
      • 默認情況下可以正常從querySet獲取
      • 隱藏bug
        • 可能會出現first和last獲取到相同的對象
          • 顯式,手動寫排序規則
  • 查詢條件
    • 屬性__運算符=值
    • get 返回單一的一條記錄,返回類型是一個對象
    • lt 小於
      • 類名.objects.filter(屬性名__lt=a)
      • 等同於,屬性名 < a
    • gt 大於
    • gte 大於等於
    • lte 小於等於
      • 類名.objects.filter(屬性名__lte=a)
      • 等同於,屬性名 <= a
    • in 在某一集合中
    • contains 類似於 模糊查詢 like --》%值% 存在該值的屬性值
    • startswith 類似於 模糊查詢 like --》值% 以該值爲開頭的屬性值
    • icontains , istartswith 大小寫不敏感
    • aggregate() 函數
      • 類名.objects().aggregate(Max(‘屬性名’))
      • Avg 平均值
      • Count 合集
      • Max 最大值
      • Min 最小值
      • Sum 和
  • 切片
    • QuerySet[5:15] 獲取第五條到第十五條記錄
      • 相當於SQL中的limit和offset
      • 其中不能爲負數
  • 緩存集
    • filter 滿足參數定義的結果集,返回的類型是列表
    • exclude 不滿足參數定義的結果集
    • all 返回全部結果集
    • 都不會真正的去查閱數據庫
    • 只有我們在迭代結果集,或者獲取單個對象屬性的時候,他纔會去查閱數據庫
    • 懶查詢
      • 爲了優化我們的結構和查詢
    • 鏈式查詢,即類名.objects.filter().exclude()
  • F對象
    • 可以獲取屬性值
    • 可以實現一個模型的不同屬性的運算操作
    • 還可以支持算術運算
    • 類名.objects.filter(屬性名__查詢條件=F(‘屬性名’))
      • 類名.objects.filter(屬性名1__lt=F(‘屬性名2’))
        • 獲取屬性名1下的值小於屬性名2下的值
  • Q對象
    • 可以對條件進行封裝
    • 封裝之後,可以支持邏輯運算
      • 與 & and
      • 或 | or
      • 非 ~ not
  • 模型成員
    • 顯性屬性
      • 開發者手動書寫的屬性
    • 隱形屬性
      • 開發者沒有書寫,ORM自動生成
      • 如果你把隱形屬性手動聲明,系統不會產生隱形屬性
        • 在model文件中生成類,繼承Manager,即model.Manager
        • 聲明方法,即獲取全部,獲取一條,增刪改查,同Models方法
        • 在自定義的數據庫類中,可以直接調用自定義封裝類,即:Ad = 自定義類()
        • 在後續的調用中,Ad即可替代objects
  • 模型關係
    • 1:1
      • 應用場景
        • 用於複雜表的拆分
        • 擴展新功能
      • Django中 OneToOneField
        • 使用的時候,關係聲明還是有細微差別
      • 實現
        • 使用外鍵實現
        • 對外鍵添加了唯一約束
      • 數據刪除
        • 級聯表
          • 主表
          • 從表
          • 誰聲明關係誰就是從表
          • 在開發中如何確認主從
            • 當系統遭遇不可避免的毀滅時,只能保留一張表,該表就是主表
          • 默認特性(casecade)
            • on_delete=models.CASECADE
            • 從表數據刪除,主表不受影響
            • 主表數據刪除,從表直接刪除
          • PROTECT 保護
            • on_delete=models.PROTECT
            • 開發中放置誤操作,通常設置此模式
            • 如果主表存在級聯數據,刪除動作受保護,不能成功
            • 主表不存在級聯數據,可以刪除成功
          • SET
            • SET_NULL
              • 允許爲NULL
            • SET_DEFAULT
              • 存在默認值
            • SET()
              • 指定值
          • 級聯數據獲取
            • 主獲取從 隱形屬性 默認就是級聯模型的名字
            • 從獲取主 顯性屬性 就是屬性的名字
    • 1:M
      • ForeignKey
      • 主從獲取
        • 主獲取從 隱形屬性 級聯模型_set
          • student_set Manager的子類
            • all,filter等都可使用
        • 從獲取主 顯性屬性
    • M:N
      • 開發中很少直接使用多對多屬性,而是自己維護多對多的關係
      • 產生表的時候會產生單獨的關係表
        • 關係表中存儲關聯表的主鍵,通過多個外鍵實現的
        • 多個外鍵值不能同時相等
      • 級聯數據獲取
        • 從獲取主
          • 使用屬性,屬性是一個Manager子類
        • 主獲取從
          • 隱形屬性
            • 也是Manager子類,操作和從操作一致
              -ManyRelatedManager
        • 函數中定義的類
        • 並且父類是一個參數
        • 動態創建
  • 模型繼承
    • Django中模型支持繼承
    • 默認繼承是會將通用字段放在父表中,特定字段放在自己的表中,中間使用外鍵連接
      • 關係型數據庫關係越複雜,效率越低,查詢越慢
      • 父表中也會存儲過多的數據
    • 使用元信息來解決這個問題
      • 使模型抽象化
        • 在元信息中,添加:abstract=True
      • 抽象的模型就不會在數據庫中產生映射了
      • 子模型映射出來的表直接包含父模型的字段

view視圖

  • 加載器
    • loader
      • 使用的是django.template.loader
      • 通過loader.get_template(‘html’)    獲取到模板中的HTML頁面並以字符串的形式保存
      • loader.get_template(‘html’).render()    此時將該字符串渲染成HTML,render可以向HTML中傳參
  • 頁面渲染
    • render(request,‘html’,context=context)
      • 其中context爲字典,在渲染前定義,context={…},同下
    • render(request,‘html’,{…})
  • URL反向解析
    • 根據跟路由中註冊的namespace和子路由中註冊name,這兩個參數獲取我們的路徑
    • 在模板中使用
      • {% url ‘namespace:name’%}
    • 如果帶有位置參數
      • {% url ‘namespace:name’ value1 value2%}
    • 如果帶有關鍵字參數
      • {% url ‘namespace:name’ key1=value1 key2=value2%}
      • name爲url中匹配的內容,即?P[0-9]{4} key爲year,value爲要傳給year的值
  • 重定向
    • redirect
      • redirect(reverse(“namespace:name”))
      • 重定向到該路由下的頁面
      • 位置參數
        • redirect(reverse(“namespace:name”,args=(value1,value2…)))
      • 關鍵字參數
        • redirest(reverse(“namespace:name”,kwargs={key1:value1,key2:value2…}))
  • 雙R
    • request
    • 屬性
      • path
        • 請求的完整路徑
      • method
        • 請求的方法,常用GET,POST
      • encoding
        • 編碼方式
          -GET
        • 類似字典的參數,包含了get的所有參數
      • POST
        • 類似字典的參數,包含了post的所有參數
      • FILES
        • 類似字典的參數,包含上傳的文件
      • cookies
        • 字典,包含了所有的cookie
          -session
        • 類似字典,表示會話
    • 方法
      • is_ajax()
        • 判斷請求是否爲ajax()
      • get
        • request.POST.get(‘name’)
          • 獲取到POST請求中name的value,多個的話只能獲取到最後一個
        • request.POST.getList(’’)
          • 獲取到全部的value
      • META
        • request.META
          • 可獲取到訪問者的所有信息,返回字典
        • request.META.get(“REMOTE_ADDR”)
          • 可獲取到訪問者來源ip
  • response
    • 屬性
      • content
        • 返回的內容
      • charset
        • 編碼格式
      • status_code
        • 響應狀態碼
      • content-type
        • MIME類型
          • 互聯網郵件傳輸擴展類型
          • 標識瀏覽器以什麼形式打開我們的內容
          • 大類型/小類型
    • 方法
      • init
        • 初始化內容
      • write(xxx)
        • 直接寫出文本
      • flush()
        • 沖刷緩衝區
      • set_cookie(key,value=‘xxx’,max_age=None,exprise=None)
        • 設置cookie
      • delete_cookie(key)
        • 刪除cookie
      • HttpResponseRedirect(‘url’)
        • 此時建議使用URL反向解析,reverse(‘xxx’)
        • 重定向
        • 302
      • JsonResponse
        • 以json格式返回數據
        • 重寫了_init_,序列化json數據,指定content_type爲application/json
      • Http404
        • Exception
        • ralse 主動拋異常
  • 會話技術
    • 出現場景
      • 服務器如何識別客戶端
      • http在web開發中基本上都是短連接
    • 請求生命週期
      • 從Request開始
      • 到Response結束
    • 種類
      • cookie
        • 客戶端會話技術
          • 數據存儲在客戶端
        • 鍵值對存儲
        • 支持過期時間
        • 默認cookie會自動攜帶,本網站所有cookie
        • cookie不能跨域名,跨網站
        • cookie默認不支持中文
        • 通過HttpResponse
        • response=HttpResponse(‘xx’)
          • 也可以使用HttpResponseRedirect(‘xxxx’)等
        • cookie創建和獲取值
          • response.set_cookie(key,value,max_age=None,exprise=None)
            • max_age
              • 整數,指定cookie的過期時間
                -expries
              • 整數,指定過期時間,支持datatime或timedeita,可以指定一個具體的日期時間
            • 二者選擇一個
          • response.get_cookie(xxx)
        • 加鹽
          • 加密
            • response.set_signed_cookie(key,value,salt=‘xxx’)
          • 解密
            • request.get_signed_cookie(key,salt=‘xxx’)
        • cookie刪除
          • response=HttpResponse(xx)等
          • response.delete_cookie(key)
      • session
        • 服務端會話技術
        • 數據存儲在服務器中
        • 默認session存儲在內存中
        • Django中默認會把session持久化到數據庫中
        • Django中session的默認過期時間是14天
        • 主鍵是字符串
        • 數據使用了數據安全
          • 使用base64 (最後以=結尾)
          • 前面添加了一個混淆串
        • session依賴於cookie
        • 創建session
          • request.session[“key”]=value
        • 獲取session中的value
          • request.session.get(“key”)
          • 建議使用get,使用字典的方法獲取key中的value,如果不存在會拋出異常,使用get,如果不存在則會返回None
        • 刪除session和cookie
          • request.session.flush()
          • 會將session和cookie全部刪除
      • Token
        • 服務端會話技術
        • 自定義的session
        • 如果web頁面開發中,使用起來和session基本一致
        • 如果使用在移動端或客戶端開發中,通常以json形式傳輸,需要移動端自己存儲token,需要獲取token關聯數據的時候,主動傳遞token
      • cookie,session,token對比
        • cookie使用更簡潔,服務器壓力更小,數據不安全
        • session服務器要維護session,相對安全
        • token擁有session的優點,維護不便,支持更多的終端
    • CSRF
      • 防跨站攻擊
      • 防止惡意註冊,確保客戶端是自己的客戶端
      • 使用了cookie中的csrftoken進行驗證,傳輸
      • 服務器發送給客戶端,客戶端將cookie獲取過來,進行編碼轉換
      • 實現
        • 如果存在csrf_token標籤,響應會自動設置一個cookie,csrftoken
        • 提交的時候,自動驗證csrftoken
        • 驗證通過,正常執行,驗證不通過,403
      • 繞過CSRF
        • 使用裝飾器
        • @csrf_exempt

路由

  • 路由匹配
    • 按照列表的書寫順序進行匹配
    • 從上到下匹配,沒有最優匹配
  • 規則
    • 通常直接指定以^開頭
    • 在結尾處直接添加反斜線
    • 在路由中,在/後以$結尾,即後面不接受任何參數,固定路由,避免後續多級目錄無法訪問
    • 路由路徑中的參數使用()獲取
      • 一個圓括號對應視圖函數中的一個參數
      • 參數
        • 路徑參數
          • 位置參數
            • 按照書寫順序進行匹配
          • 關鍵字參數
            • 按照參數名稱匹配,和順序無關
          • 參數個數必須和視圖函數中參數的個數一致(除request外)

templates

  • {{ 值 }}
  • {% %}
    • 可聲明變量
  • 循環
    • {%for %}{%endfor %}
      • {{ forloop.counter}}
        • 當前第幾次循環,從1開始
      • {{ forloop.counter0}}
        • 表示當前是第幾次循環,從0開始
      • {{ forloop.revcounter}}
        • 表示當前是第幾次循環,倒數
      • {{ forloop.revcounter0}}
        • 表示當前是第幾次循環,倒數,從0開始
      • {{ forloop.first}}
        • 是否是第一個,返回類型:布爾
      • {{ forloop.last}}
        • 是否是最後一個,返回類型:布爾
  • 判斷
    • {%if %}{%endif %}
    • {% ifequal value1 value2 %} {% endifequal %} 等值比較
    • {% ifnotequal value1 value2 %}{% endifnotequal %} 非等值比較
  • 註釋
    • 單行註釋
      • {# #}
    • 多行註釋
      • {% comment %}{% endcomment %}
  • 乘除
    • {% widthratio 數 分母 分子 %}
  • 整除
    • {% if num | divisibleby:2 %}
  • URL 反向解析
    • {% url ‘namespace:name’ p1 p2%}
  • 結構標籤
    • block
      • 規劃佈局
      • 首次出現,表示規劃
      • 再次出現,代表填充以前的規劃
      • 第三次出現,代表填充以前的規劃,默認動作是覆蓋
        • 可添加{{ block.super}} ,即可實現增勢操作
    • extends
      • 繼承
      • 可以獲取父母版中的所有結構
    • include
      • 包含,可將頁面作爲一部分嵌入到其他頁面
    • 推薦使用block+extends,使用include效率較低
    • 如果繼承至父模板,子模板重寫頁面結構不生效,只能在已有的塊結構中填充

靜態資源

  • 動靜分離
  • 創建靜態文件夾
  • 在settings中註冊 STATICFILES_DIRS=[]
  • 在模板中使用
    • 先加載靜態資源 {% load static %}
    • 使用{% static ‘xx’ %} xx爲相對路徑
  • 缺點
    • 僅能在debug模式中使用
    • 需要單獨處理

常見算法

  • 編碼
    • Base64
  • 摘要、指紋、雜湊
    • 單項不可逆
    • 輸出長度固定
    • 輸出變更一點點,輸出發生很大變更
    • MD5,SHA
    • hashlib
  • 加密
    • 對稱加密
      • 一把鑰匙
    • 非對稱加密
      • 一對鑰匙
      • 公鑰
      • 私鑰
      • RSA、PGP

文件上傳

  • 原生,Django和flask均可使用
    • 客戶端
      • 必須使用POST
      • 指定enctype=‘multlplepart/form-data’
    • views中
    • 獲取POST請求內容
      • img=request.FILES.get(‘name’)
    • 開始存儲圖片
       with open("url/demo.jpg","wb") as save_file:
          for  part in icon.chunks():
              save_file.write(part)
              save_file.flush()
      
  • Django內置
    • 在models中定義上傳
      class Upload(models.Model):
          # upload_to 相對路徑,相對於MEDIA_ROOT  媒體根目錄
          # 使用imagefield需要導入pillow包
          u_icon=models.ImageField(upload_to='icons')
          # 此時,圖片存儲位置爲:static/upload/icons目錄下,在linux中,一個文件夾中最多存儲65535
          # 使用年月日命名的路徑,對文件內容進行優化
          u_icon=models.ImageField(upload_to='%Y/%m/%d/icons')
          # 將會將照片存儲在MEDIA_ROOT文件夾下的當前年,當前月,當前日文件下的icons中
      
    • 在setting中指定MEDIA_ROOT路徑
      • MEDIA_ROOT=os.path.join(BASE_DIR,‘static/upload’)

緩存

  • 提升服務器相應速度
  • 將執行過的操作數據存儲下來,在一定時間內,再次獲取數據的時候,直接從緩存中獲取
  • 緩存使用內存級緩存
  • Django內置緩存框架
  • 數據庫緩存
    • setting配置
        CACHE={
            'default':{
                'BACKEND':'django.core.cache.backends.db.DatabaseCache',
                'LOCATION':'my_cache_table',
                'TIMEOUT':60*5  #緩存5分鐘
            }
        }
    
    • 設置緩存裝飾器
      • @cache_page(timeout)
      • 在緩存函數上添加裝飾器,並導入包
    • 自定義緩存
      • cache.set(“key”,value,timeout)
      • key 即獲取的頁面信息
      • value 即render渲染頁面後獲取的頁面文本,response.cotent
      • timeout=60 設置緩存時間爲60
  • 使用Redis做緩存
    • django-redis
      • 安裝
        • pip install django-redis
    • django-redis-cache
      • 安裝
        • pip install django-redis-cache
    • setting配置
       CACHES={
           'default':{
               "BACKEND":"django_redis.cache.RedisCache",
               "LOCATION":"redis://127.0.0.1:6379/1",
               "OPTIONS":{
                   "CLIENT_CLASS":"django_redis.client.DefaultClient",
               }
           }
       }
      
  • 混合使用Cache緩存
    • setting配置
        CACHE={
            'default':{
                'BACKEND':'django.core.cache.backends.db.DatabaseCache',
                'LOCATION':'my_cache_table',
                'TIMEOUT':60*5  #緩存5分鐘
            },
            'redis':{
                "BACKEND":"django_redis.cache.RedisCache",
                "LOCATION":"redis://127.0.0.1:6379/1",
                "OPTIONS":{
                    "CLIENT_CLASS":"django_redis.client.DefaultClient",
                }
            }
        }
    
    • 裝飾器選擇
      • @cache_page(timeout,cache=‘default’)
      • 選擇第一個類型的緩存方式,數據庫緩存
    • 自定義選擇緩存
      • cache=caches[‘redis’]
      • 選擇使用redis緩存

中間件

  • AOP
    • 面向切面編程
    • 實現統計功能
      • 統計IP
      • 統計瀏覽器
    • 實現權重控制
      • 白名單
      • 黑名單
    • 實現反爬
      • 反爬蟲
      • 實現頻率控制
  • 註冊中間件
    • setting配置
      • 查找MIDDLEWARE列表
      • 添加:‘middleware.pyname.name’
      • middleware 創建的中間件文件
      • pyname 中間件文件中的py文件
      • name py文件中的類名
  • 創建中間件
    • 創建一個包
      • middleware
    • 創建一個py文件
      • 中間件是一個類
      class name(MiddlewareMixin):
          def process_request(self,request):
              print(request.META.get("REMOTE_ADDR"))  #即可獲取到訪問該站點的來源ip地址
      
              if request.path="url":   #判斷路由
                  return HttpResponse("你好")     #可直接返回頁面
      
    • 頁面友好化
      • 出現錯誤,實現自動跳轉到目標網頁
      def process_exception(self,request,exception):
          redirect(reverse('name:namespace'))  #出現錯誤,跳轉到目標頁面
      
  • 調用順序
    • 中間件註冊的時候是一個列表
    • 如果我們沒有在切點處直接進行返回,中間件會依次執行
    • 如果直接進行返回,後續中間件不再執行
  • 切點
    • process_request
      • 統計,打印
      • 優先級調度
        • 黑名單
        • 白名單
      • 反爬,頻率控制
        • 控制訪問次數方法
          • 記錄每次請求的時間
          • 數據結構 key-value value=[]
          • 判斷一定時間請求次數前,判斷列表長度
          • 判斷之前進行數據清洗
    • process_view
      • CSRF
      • 首先判斷兩種豁免條件
      • 判斷請求是否安全
      • POST請求驗證CSRF
    • process_template_response
    • process_response
      • 跨域處理
        • ip和端口不一致
        • 跨域行爲校驗是瀏覽器行爲
        • 實現跨域
          • 服務器端添加屬性,允許所有域名訪問
          • 客戶端進行僞裝
      • 對響應進行統一處理
    • process_exception

分頁器

  • Paginator
    • 數據分頁工具
    • 對象創建
      • Paginator(數據集,每一頁數據數)
    • 屬性
      • count 對象總數
      • num_pages 頁面總數
      • page_range 頁碼列表,從開始
    • 方法
      • page(整數) 獲得一個page對象
  • Page
    • 具體的某一頁面
    • 常見錯誤
      • InvalidPage
        • page() 傳遞無效頁碼
      • PageNotAnInteger
        • page() 傳遞的不是整數
      • Empty
        • page() 傳遞的值有效,但沒有數據
    • 屬性
      • object_list
        • 當前頁面上所有的數據對象
      • number
        • 當前頁的頁碼值
      • paginator
        • 當前page關聯的Paginator對象
    • 方法
      • has_next()
        • 判斷是否有下一頁
      • has_previous()
        • 判斷是否有上一頁
      • has_other_pages()
        • 判斷是否有上一頁或下一頁
      • next_page_number()
        • 返回下一頁的頁碼
      • previous_page_number()
        • 返回上一頁的頁碼
      • len()
        • 返回當前頁的數據的個數

驗證碼

  • 使用繪圖 Pillow
    • 安裝
      • pip install Pillow
    • 實現驗證碼的方法
     mode="RGB"
     size=(x,y)  # 大小,即畫板的大小
     color=(255,0,0) #顏色
     image=Image.new(mode=mode , size=size ,color=color) # 創建一個新的畫
     imgdraw=ImageDraw(image,mode=mode) # 創建一個新的畫板
     imgfont=ImageFont.truetype(setting.FONT_PATH , size)   # 創建畫筆,指定文本類型
     # 畫筆的配置,指定文本的類型,size爲文本的大小
     # 在setting中配置文本類型,將字體類型實現複製到指定的包中
     fill=(255,0,0)  # 設置字體顏色
     Imagedraw.text(xy=(x,y) , text='' , font=imgfont , fill=fill)  # 配置畫板,添加本文
     # xy=(x,y) 文本在畫板中的初始位置
     # text=''   畫板中的文本信息
     # font=imgfont  畫板中文本信息的配置
     fp=BytesIO()    # 使用內存流
     image.save(fp,'png')    # 存儲
     return HttpResponse(fp.getvalue(),content_type="image/png")
     # 頁面返回信息,即獲取內存流中的內容,並以圖片png的格式回顯
    
    • 前端隨機切換驗證碼
      • 使用js,每次切換驗證碼路徑
      $(function()){
          $('img').click(function){
              $(this.attr("src","url/?t=" + Math.random()))
              //切換驗證碼圖片,需要切換路徑,如果不切換路徑,驗證碼圖片內容不進行二次調用和切換,後面加上隨機數,可以實現驗證碼每次的請求
          }
      }
      

富文本

  • tinymce插件
    • 安裝
      • pip install django-tinymce
    • setting配置
      • INSTALLED_APPS添加 tinymce應用
        • ‘tinymce’
      • 添加默認配置
        • TINYMCE_DEFAULT_CONFIG={
          ‘theme’:‘advanced’,
          ‘width’:800,
          ‘height’:600,
          }
    • 頁面導入
      • head中添加script
        • 引入static文件夾
          • {% load static %}
        • 添加script
        <script src="/static/tiny_mce/tiny_mce.js"></script>
        <script>
            tinyMCE.init({
                'mode':'textareas',
                'theme':'advanced',
                'width': 800,
                'height':600
            })
        </script>
        

後臺

  • 修改setting配置文件
    • 切換至中國時區
  • 創建管理員
    • python manage.py createsuperuser
  • 註冊模型類
    • admin.py下注冊
    • admin.site.register(class_name)
  • 自定義返回屬性
    • models.py中進行配置
      • 數據類下添加:
      def __str__(self):
          return self.name   
          # name即要返回的屬性值
      
  • 自定義模型管理類
    class class_name_admin(admin.ModelAdmin):
        list_display=['id','title',...]
        # id,title等均爲模型類中的屬性名稱,即後臺中顯示的屬性名稱
    # 註冊模板類
    admin.site.register(class_name,class_name_admin)
    # class_name 爲模型類名稱,class_name_admin爲自定義模型管理類名稱
    
  • 後臺顯示屬性名
    • 在models.py文件配置

      ```
      class article(models.Model):
          title=models.CharField(verbose_name="name")
          # title爲屬性名,name爲後臺中顯示的屬性名稱
      
          def __str__(self):
              return self.title
          
          def demo(self):
              return self.title
          
          demo.admin_order_field='title' 
          # 以title進行排序
          demo.short_decription="name"
          # title顯示的名稱name
      ```
      
  • 後臺刪除數據執行窗口
    • 在admin.py文件中配置
      • 在窗口的下方出現執行窗口
        • actions_on_bottom=True
      • 取消窗口上方的執行窗口
        • 默認是在上方出現執行窗口
        • actions_on _top=False
  • 後臺右側過濾欄
    • 在admin.py文件中配置
      • list_filter=[‘name’] # name爲要過濾的屬性值
  • 後臺搜索欄
    • 在admin.py文件中配置
      • search_fields=[‘name’] # 以屬性值爲name進行搜索
  • 後臺編輯
    • 在admin.py文件中配置
      • 一對一編輯

        • fields=[‘id’,‘title’] # id,title均爲字段名,即設置顯示的字段名順序和字段名
        • fieldsets=(
          (‘name’,{‘fields’:[‘id’]}),
          (‘name’,{‘fields’:[‘title’]})
          ) # name爲組名,即分組名稱,id爲該組中存在的字段
      • 一對多編輯

        ```
        class class_name(admin.StackedInline):
            model=Article   # 多類的名稱,models中類名
            extra=2 # 顯示的空行數
        
        class_name_admin(admin.ModelAdmin):
            inlines=[class_name]    # 即定義一對多的類的類名
        ```
        

狀態碼

  • 2xx
    • 請求成功
  • 3xx
    • 轉發或重定向
  • 4xx
    • 客戶端錯誤
  • 5xx
    • 服務器錯誤
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章