Django的基本使用(七)
一、在django中靜態資源的使用
1.靜態資源: 如:css,js,img,檔案… 在django中放在static目錄下的
2.使用:
-
在專案的目錄下建立static目錄
-
在setting中配置了才可以使用 配置: 在setting的後面追加:
STATICFILES_DIRS = [static的路徑os.path.join(BASE_DIR,"static")]
-
在模板html中 1. 在html的首行加上
{% load static %}
2. 使用:{% static '相對於static的路徑' %}
如:js<script type="text/javascript" src="{% static '相對於static的路徑' %}"></script>
{# 在django中不推薦使用 <script type="text/javascript" src="/static/js/bind_polyfill.js"></script>#}
3. 靜態資源可以直接通過url訪問
格式: http://地址:埠號/static/資源路徑
如: http://10.31.160.135:8003/static/img/xxx.jpeg
二、動靜態資源分離
-
靜態資源 1. 在django專案中放在static目錄的下就是靜態資源 如: css,js,img,檔案,html 2. 注意如果html放在staic就是靜態的
-
動態資源 1. 一些可以動態執行的程式碼,如: python, template語言下的html 2. template語言下的html其實django的一種特殊的語言
三、驗證碼---- 提高安全性的
1. 特點:
- 時效性
- 隨機性
- 安全
- 模糊
2. 使用:
- 安裝pillow模組來處理
pip install pillow
-
材料: 畫布, 畫筆,…
-
程式碼畫驗證碼:
# 建立一個畫布 # mode 畫布模式, "RGB" # size 畫布的寬高 # color表示顏色 如: (33,33,33)即(紅,綠,藍) 每個值的範圍是0-255, image = Image.new("RGB",(200,70),createColor()) # 建立一個畫筆 # 引數1是繫結的畫布 # 引數2是模式 imageDraw = ImageDraw.Draw(image,"RGB") # 設定字型 imageFont = ImageFont.truetype("static/fonts/ADOBEARABIC-ITALIC.OTF",size=50) # 畫 # xy, 畫的起始位置(座標) # text 畫的內容 # fill = None, 填充的顏色 # font = None, 設定字型樣式及大小的 # imageDraw.text((5,10),"nizhenliao",fill=createColor(),font=imageFont) charSource = "qwertyuiopasdfghjklzxcvbnmQWERTYUIOPASDFGHJKLZXCVBNM1234567890" # 一個一個的寫 # 隨機生成一個字母數字, 隨機4次 for i in range(4): # 隨機選一個字母 ch = random.choice(charSource) imageDraw.text((20+i*50,10),ch,fill=createColor(),font=imageFont) # 給驗證碼圖片上畫一些點,使其模糊 for i in range(2000): x = random.randint(0,200) y = random.randint(0,70) imageDraw.point((x,y),fill=createColor()) # 建立一個位元組流 import io byteIO = io.BytesIO() # 把圖片儲存到位元組流中去 image.save(byteIO,"png") return HttpResponse(byteIO.getvalue(),"image/png")
四、驗證碼功能
-
展示
-
點選重新整理 1.給驗證圖片設定點選事件 2.每點選一次重新請求一次 3.注意: 如果我們每次重新整理做的事同樣的請求,瀏覽器會認為請求的是同一個內容,會自動的使用上一次的內容(快取), 導致驗證碼不能重新整理 解決:使得每次請求url都發生變化
-
如:
//登入頁 驗證碼點選重新整理 $(function () { //設定點選事件 $("#verificationCode").click(function () { // alert("xxxxxx") $(this).attr("src","/day07/getVerificationCode"+Math.random()) }) })
五、驗證驗證碼
-----即 在請求驗證碼的時候保留一個驗證碼,使用者提交的時候會提交一個驗證碼, 如果兩個驗證碼一致則匹配成功
1.請求驗證碼的時候保留驗證碼到session
# 伺服器儲存一份驗證碼
request.session["verCode"] = verCode
# 設定過期事件 單位秒
request.session.set_expiry(30)
2.提交的時候驗證驗證碼
# 獲取使用者輸入的驗證碼
verCode1 = request.GET.get("verCode")
# 與伺服器儲存的驗證碼對比
verCode2 = request.session.get("verCode")
# 空判斷
if verCode1.lower() == verCode2.lower(): #匹配成功
六、圖片的上傳
案例: 使用者註冊圖片上傳
1.設計模型
u_name 使用者名稱
u_age 密碼
....
u_img 頭像
# 儲存頭像 ---- 本質上儲存的是檔案的路徑
# 目錄 : static/upload /icon
# upload_to 表示指定圖片上傳的相對路徑名, 及檔案上傳的路徑的字首
u_img = models.ImageField(upload_to="icon")
注意: 上傳目錄需要配置後才能使用
1.在static目錄下建立檔案上傳放置目錄upload 2.需要在setting中配置,在setting的後面追加 :
MEDIA_ROOT = os.path.join(BASE_DIR,"static/unload")
2.表單
1.上傳檔案的標籤:
<input type="file" name="img">
2.表單提交需要用post請求,還需要設定資料的編碼型別,如: enctype="multipart/form-data"
3.伺服器處理
1.檔案的接收:
# 獲取檔案資料
data = request.FILES.get("key")
2.儲存到資料庫
user.u_img = data 直接設定file獲取的值即可,django會自動的處理
4.展示資料庫儲存的圖片
1.獲取圖片的路徑
# print(user.u_img) #資料中的相對路徑
# print(user.u_img.path) #絕對路徑
# print(user.u_img.url) #相對路徑
imgPath = "/static/upload/" + user.u_img.url
2.傳遞要給模板即可
七、自定義檔案上傳
# 獲得檔案
uploadFile = request.FILES.get("img")
# 檔案的寫入操作
# 伺服器檔案的名字通常唯一的
# 設定檔名及上傳路徑
filePath = os.path.join(settings.MEDIA_ROOT,createFileName()+".jpg" )
# 以寫的方式開啟檔案
with open(filePath,mode="wb") as wf:
# 將檔案分成很多分寫入
for i in uploadFile.chunks():
wf.write(i)
wf.flush()
八、中間健 middleware
概念: 是一個輕量級的,底層的外掛,可以介入Django的請求和響應過程(面向切面程式設計)
1.使用:
1.在專案的目錄下新建目錄middleware 2.在middleware目錄下新建一個 模組A 3.在模組A中定義一箇中間鍵類B,B類需要繼承 MiddlewareMixin 4.在B類中重新對應流程的方法 5.需要setting中配置 在middleware中新增: 目錄名middleware.模組名A.類名B 即可
2.常用的方法:
-
def process_request(self,request):
該方法在進入url路由前執行,在該方法中可以使用 return 響應體 來終止向後執行,直接響應客戶端, 所有的url請求都會執行它 場景: (1)反爬蟲 (2)黑名單/白名單 (3)vip區別… 如:def process_request(self,request): # 獲得訪問地址 print(request.path) # 獲得訪問使用者的ip地址 print(request.META["REMOTE_ADDR"]) addr = request.META["REMOTE_ADDR"] # 黑名單 if addr in ["10.31.160.24","10.31.160.229"]: return HttpResponse("滾吧,不歡迎你")
-
def process_exception(self, request, exception):
該方法在出現異常的時候執行,在該方法中可以處理跳過異常.使程式不出錯def process_exception(self, request, exception): #當程式發生異常時,跳到首頁 return HttpResponse("假裝跳到首頁了")