基礎指令
- 創建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和端口
- python manage.py runserver
基礎配置
- setting文件中配置網頁文件
- 在TEMPLATES字典中,key爲DIRS的列表中添加
- os.path.join(BASE_DIR,‘templates’)
- 在TEMPLATES字典中,key爲DIRS的列表中添加
- setting文件中配置靜態文件
- STATICFILES_DIRS={
os.path.join(BASE_DIR,‘static’)
}
- STATICFILES_DIRS={
- 數據庫配置
- init.py配置MySQL
- import pymysql
- pymysql.install_as_MySQLdb()
- init.py配置MySQL
- 路由配置
- 項目邏輯過於複雜,可以進行拆分
- 拆分成多個App
- 繼續拆分路由器 urls,在第一個APP下的url中添加路由進行包含,如:url(r"^next/",include(‘app.urls’)),
- 在App 中創建自己的urls
- urlpatterns 路由規則列表
- 在根urls中進行子路由包含
- 子路由的使用
- 根路由規則,子路由的規則
- 在App 中創建自己的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文件
- 自帶元信息
- python manage.py inspectdb
- 生成遷移文件 (正向遷移)
-
- 連接本地MySQL
- MySQLclient
-python2,3都能直接使用
-致命缺點
-對MySQL的安裝有要求,必須指定位置存在配置文件 - python-mysql
- python2 支持很好
- python3 不支持
- pymysql
- python2,python3都支持
- 它還可以僞裝成前面的庫
- MySQLclient
- 字段屬性
- null
- 如果爲True,django可以爲空值,默認爲False
- blank
- 如果爲True,該字段允許爲空白
- db_colum
- 字段的名稱,如果未指定,則使用屬性名稱
- db_index
- 若值爲True,則在表中爲該字段創建索引
- default
- 默認值
- primary_key
- 若爲True,則該字段會成爲模型的主鍵字段
- unique
- 如果爲True,這個字段在表中必須有唯一值
- null
- 模型過濾
- filter
- exclude
- 連續使用
- 鏈式調用
- 表名.objects.filter(條件) 可多個filter
- order by()
- 排序
- values()
- 一條數據就是一個字典,返回一個列表
- 查詢方法
- get() 獲取數據
- 查詢條件沒有匹配對象,拋出異常,DoesNotExist
- 如果查詢條件對應多個對象,會跑出異常MultipleObjectsReturned
- first()和last() 獲取第一個和最後一個數據
- 默認情況下可以正常從querySet獲取
- 隱藏bug
- 可能會出現first和last獲取到相同的對象
- 顯式,手動寫排序規則
- 可能會出現first和last獲取到相同的對象
- get() 獲取數據
- 查詢條件
- 屬性__運算符=值
- 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
- 其中不能爲負數
- QuerySet[5:15] 獲取第五條到第十五條記錄
- 緩存集
- filter 滿足參數定義的結果集,返回的類型是列表
- exclude 不滿足參數定義的結果集
- all 返回全部結果集
- 都不會真正的去查閱數據庫
- 只有我們在迭代結果集,或者獲取單個對象屬性的時候,他纔會去查閱數據庫
- 懶查詢
- 爲了優化我們的結構和查詢
- 鏈式查詢,即類名.objects.filter().exclude()
- F對象
- 可以獲取屬性值
- 可以實現一個模型的不同屬性的運算操作
- 還可以支持算術運算
- 類名.objects.filter(屬性名__查詢條件=F(‘屬性名’))
- 類名.objects.filter(屬性名1__lt=F(‘屬性名2’))
- 獲取屬性名1下的值小於屬性名2下的值
- 類名.objects.filter(屬性名1__lt=F(‘屬性名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()
- 指定值
- SET_NULL
- 級聯數據獲取
- 主獲取從 隱形屬性 默認就是級聯模型的名字
- 從獲取主 顯性屬性 就是屬性的名字
- 級聯表
- 應用場景
- 1:M
- ForeignKey
- 主從獲取
- 主獲取從 隱形屬性 級聯模型_set
- student_set Manager的子類
- all,filter等都可使用
- student_set Manager的子類
- 從獲取主 顯性屬性
- 主獲取從 隱形屬性 級聯模型_set
- M:N
- 開發中很少直接使用多對多屬性,而是自己維護多對多的關係
- 產生表的時候會產生單獨的關係表
- 關係表中存儲關聯表的主鍵,通過多個外鍵實現的
- 多個外鍵值不能同時相等
- 級聯數據獲取
- 從獲取主
- 使用屬性,屬性是一個Manager子類
- 主獲取從
- 隱形屬性
- 也是Manager子類,操作和從操作一致
-ManyRelatedManager
- 也是Manager子類,操作和從操作一致
- 隱形屬性
- 函數中定義的類
- 並且父類是一個參數
- 動態創建
- 從獲取主
- 1:1
- 模型繼承
- Django中模型支持繼承
- 默認繼承是會將通用字段放在父表中,特定字段放在自己的表中,中間使用外鍵連接
- 關係型數據庫關係越複雜,效率越低,查詢越慢
- 父表中也會存儲過多的數據
- 使用元信息來解決這個問題
- 使模型抽象化
- 在元信息中,添加:abstract=True
- 抽象的模型就不會在數據庫中產生映射了
- 子模型映射出來的表直接包含父模型的字段
- 使模型抽象化
view視圖
- 加載器
- loader
- 使用的是django.template.loader
- 通過loader.get_template(‘html’) 獲取到模板中的HTML頁面並以字符串的形式保存
- loader.get_template(‘html’).render() 此時將該字符串渲染成HTML,render可以向HTML中傳參
- loader
- 頁面渲染
- render(request,‘html’,context=context)
- 其中context爲字典,在渲染前定義,context={…},同下
- render(request,‘html’,{…})
- render(request,‘html’,context=context)
- 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…}))
- redirect
- 雙R
- request
- 屬性
- path
- 請求的完整路徑
- method
- 請求的方法,常用GET,POST
- encoding
- 編碼方式
-GET - 類似字典的參數,包含了get的所有參數
- 編碼方式
- POST
- 類似字典的參數,包含了post的所有參數
- FILES
- 類似字典的參數,包含上傳的文件
- cookies
- 字典,包含了所有的cookie
-session - 類似字典,表示會話
- 字典,包含了所有的cookie
- path
- 方法
- is_ajax()
- 判斷請求是否爲ajax()
- get
- request.POST.get(‘name’)
- 獲取到POST請求中name的value,多個的話只能獲取到最後一個
- request.POST.getList(’’)
- 獲取到全部的value
- request.POST.get(‘name’)
- META
- request.META
- 可獲取到訪問者的所有信息,返回字典
- request.META.get(“REMOTE_ADDR”)
- 可獲取到訪問者來源ip
- request.META
- is_ajax()
- response
- 屬性
- content
- 返回的內容
- charset
- 編碼格式
- status_code
- 響應狀態碼
- content-type
- MIME類型
- 互聯網郵件傳輸擴展類型
- 標識瀏覽器以什麼形式打開我們的內容
- 大類型/小類型
- MIME類型
- content
- 方法
- 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 主動拋異常
- init
- 屬性
- 會話技術
- 出現場景
- 服務器如何識別客戶端
- 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,可以指定一個具體的日期時間
- 整數,指定cookie的過期時間
- 二者選擇一個
- max_age
- response.get_cookie(xxx)
- response.set_cookie(key,value,max_age=None,exprise=None)
- 加鹽
- 加密
- 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的優點,維護不便,支持更多的終端
- cookie
- 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}}
- 是否是最後一個,返回類型:布爾
- {{ forloop.counter}}
- {%for %}{%endfor %}
- 判斷
- {%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效率較低
- 如果繼承至父模板,子模板重寫頁面結構不生效,只能在已有的塊結構中填充
- block
靜態資源
- 動靜分離
- 創建靜態文件夾
- 在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’)
- 在models中定義上傳
緩存
- 提升服務器相應速度
- 將執行過的操作數據存儲下來,在一定時間內,再次獲取數據的時候,直接從緩存中獲取
- 緩存使用內存級緩存
- 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", } } }
- django-redis
- 混合使用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文件中的類名
- setting配置
- 創建中間件
- 創建一個包
- 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
- process_request
分頁器
- Paginator
- 數據分頁工具
- 對象創建
- Paginator(數據集,每一頁數據數)
- 屬性
- count 對象總數
- num_pages 頁面總數
- page_range 頁碼列表,從開始
- 方法
- page(整數) 獲得一個page對象
- Page
- 具體的某一頁面
- 常見錯誤
- InvalidPage
- page() 傳遞無效頁碼
- PageNotAnInteger
- page() 傳遞的不是整數
- Empty
- page() 傳遞的值有效,但沒有數據
- InvalidPage
- 屬性
- object_list
- 當前頁面上所有的數據對象
- number
- 當前頁的頁碼值
- paginator
- 當前page關聯的Paginator對象
- object_list
- 方法
- has_next()
- 判斷是否有下一頁
- has_previous()
- 判斷是否有上一頁
- has_other_pages()
- 判斷是否有上一頁或下一頁
- next_page_number()
- 返回下一頁的頁碼
- previous_page_number()
- 返回上一頁的頁碼
- len()
- 返回當前頁的數據的個數
- has_next()
驗證碼
- 使用繪圖 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,
}
- TINYMCE_DEFAULT_CONFIG={
- INSTALLED_APPS添加 tinymce應用
- 頁面導入
- 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>
- 引入static文件夾
- head中添加script
- 安裝
後臺
- 修改setting配置文件
- 切換至中國時區
- 創建管理員
- python manage.py createsuperuser
- 註冊模型類
- admin.py下注冊
- admin.site.register(class_name)
- 自定義返回屬性
- models.py中進行配置
- 數據類下添加:
def __str__(self): return self.name # name即要返回的屬性值
- models.py中進行配置
- 自定義模型管理類
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文件中配置
- 後臺右側過濾欄
- 在admin.py文件中配置
- list_filter=[‘name’] # name爲要過濾的屬性值
- 在admin.py文件中配置
- 後臺搜索欄
- 在admin.py文件中配置
- search_fields=[‘name’] # 以屬性值爲name進行搜索
- 在admin.py文件中配置
- 後臺編輯
- 在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] # 即定義一對多的類的類名 ```
-
- 在admin.py文件中配置
狀態碼
- 2xx
- 請求成功
- 3xx
- 轉發或重定向
- 4xx
- 客戶端錯誤
- 5xx
- 服務器錯誤