1. 程式人生 > >Django的檔案上傳以及中間鍵

Django的檔案上傳以及中間鍵

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('假裝跳到首頁')