Django的檔案上傳以及中間鍵
阿新 • • 發佈:2018-11-06
1、圖片的上傳
案例:使用者註冊圖片上傳
1、設計模型
u_name 使用者名稱 u_age 密碼 u_img 頭像 # 儲存頭像--本質上儲存的是檔案的路徑 # 目錄:static/upload/icon # upload_to 表示指定圖片上傳的相對路徑名,及檔案上傳的額路徑的字首 class User(models.Model): u_name = models.CharField(max_length=50) u_age = models.IntegerField(default=17) u_img = models.ImageField(upload_to='icon') 注意:上傳目錄需要配置後才能使用 1、在static目錄下建立檔案上傳放置目錄upload 2、在setting中配置 在setting的後面追加: MEDIA_ROOT = os.path.join(BASE_DIR,'static/upload')
2、表單
1、上傳檔案的標籤: 頭像:<input type="file" name="img"> 2、表單提交需要用post請求,還需要設定資料的編碼型別 <form action="{% url 'doimgupload' %}" method="post" enctype="multipart/form-data"> 3、伺服器處理: 1、檔案的接收 # 獲取檔案資料 data = request.FILES.get("key") 2、儲存到資料庫 user.u_img = data 直接設定file獲取的值即可,django會自動的處理 4、展示資料庫儲存的圖片 def getImg(request): # 獲取頭像 user = User.objects.filter(u_name='瑪花').first() # 獲取圖片的路徑 imgPath = '/static/upload/'+ user.u_img.url data = { 'imgPath':imgPath } return render(request,'getimg.html',context=data)
2、自定義檔案上傳
def doimgUpload(request): # 獲得檔案 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() return HttpResponse('上傳成功')
3、中間鍵 middleware
概念:是一個輕量級的,底層的外掛,可以介入Django的請求和響應過程(面向切面程式設計)
1、使用:
1、在專案的目錄下新建目錄middleware
2、在middleware目錄下新建一個py檔案 模組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("***********************")
# 獲得訪問地址
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('假裝跳到首頁')