1. 程式人生 > >Django的基本使用(七)

Django的基本使用(七)

一、在django中靜態資源的使用

1.靜態資源: 如:css,js,img,檔案… 在django中放在static目錄下的
2.使用:
  1. 在專案的目錄下建立static目錄

  2. 在setting中配置了才可以使用 配置: 在setting的後面追加: STATICFILES_DIRS = [static的路徑os.path.join(BASE_DIR,"static")]

  3. 在模板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. 靜態資源 1. 在django專案中放在static目錄的下就是靜態資源 如: css,js,img,檔案,html 2. 注意如果html放在staic就是靜態的

  2. 動態資源 1. 一些可以動態執行的程式碼,如: python, template語言下的html 2. template語言下的html其實django的一種特殊的語言

三、驗證碼---- 提高安全性的

1. 特點:
  1. 時效性
  2. 隨機性
  3. 安全
  4. 模糊
2. 使用:
  1. 安裝pillow模組來處理

pip install pillow

  1. 材料: 畫布, 畫筆,…

  2. 程式碼畫驗證碼:

     # 建立一個畫布
     # 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. 點選重新整理 1.給驗證圖片設定點選事件 2.每點選一次重新請求一次 3.注意: 如果我們每次重新整理做的事同樣的請求,瀏覽器會認為請求的是同一個內容,會自動的使用上一次的內容(快取), 導致驗證碼不能重新整理 解決:使得每次請求url都發生變化

  3. 如:

     //登入頁 驗證碼點選重新整理
     $(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.常用的方法:
  1. 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("滾吧,不歡迎你")
    
  2. def process_exception(self, request, exception): 該方法在出現異常的時候執行,在該方法中可以處理跳過異常.使程式不出錯

     def process_exception(self, request, exception):
         #當程式發生異常時,跳到首頁
         return HttpResponse("假裝跳到首頁了")