干貨內容
1.Django MTV模式介紹
2.Django下實作檔案上傳功能
3.Django下實作VirusTotal API呼叫
文章目錄
- 干貨內容
- 0x0 Django框架介紹
- 1x0 Django工程創建
- 1x1 創建初始Django工程
- 1x2 創建視圖檔案:views.py
- 2x0檔案上傳以及API呼叫代碼實作
- 2x1 工程settings.py設定
- 2x2 全域路由以及WebApp路由配置
- 2x3 Index.html設定
- 2x4 視圖層views.py配置
- 總結 `Go與Python的比較`
0x0 Django框架介紹
現在有很多的Web框架都是基于MVC的開發模式進行前后端分離開發的,Django其實也很類似,只不過是基于MTV的開發模式的,
這里就簡單介紹一下MTV:
- M 表示模型(Model):撰寫程式應有的功能,負責業務物件與資料庫的映射(ORM),
- T 表示模板 (Template):負責如何把頁面(html)展示給用戶,
- V 表示視圖(View):負責業務邏輯,并在適當時候呼叫 Model和 Template,
- 除了以上三層之外,還需要一個 URL 分發器,它的作用是將一個個 URL 的頁面請求分發給不同的 View 處理,View 再呼叫相應的 Model 和 Template,MTV 的回應模式如下所示:

1x0 Django工程創建
這里是通過Form形式來進行檔案上傳的,邏輯為打開主頁,點擊上傳按鈕觸發action,跳轉到fileManagerUpload,下面詳細介紹各個模塊的實作程序,
1x1 創建初始Django工程
開發環境的IDE為Pycharm,創建新工程時一定要勾選Application name,這樣會方便以后增加多個WebApp:

1x2 創建視圖檔案:views.py
下面是完整的創建工程目錄結構:

2x0檔案上傳以及API呼叫代碼實作
2x1 工程settings.py設定
因為我們要實作的功能是檔案上傳,那么我們就一定要確認檔案上傳后的絕對路徑是什么,這時候就要在settings.py下設定好路徑,
一定要注意!:windows開發時,路徑要配雙斜杠 \ \
- settings.py
BASE_DIR = Path(__file__).resolve().parent.parent
MEDIA_URL="media/"
MEDIA_ROOT = os.path.join('E:\\Project\\202104\\djangoProject\\djangoProject', 'media')
2x2 全域路由以及WebApp路由配置
urls.py是用來配置網頁呼叫邏輯的,一般來說一個WebApp初始都是有一個主頁的‘Index.html’,但在遇到多個WebApp同事存在的狀況時要統一配置:
- 全域路由urls.py配置
from django.contrib import admin
from django.urls import include,path
urlpatterns = [
path('admin/', admin.site.urls), # Django管理界面
path('', include('Virustotal.urls')), # 主頁定向到WebApp下的urls配置
]
- WebApp路由urls.py配置
urlpatterns = [
path('',views.index),
path('fileManagerUpload/',views.fileManagerUpload),
] + static(settings.MEDIA_URL,document_root=settings.MEDIA_ROOT)
2x3 Index.html設定
這里我把異步顯示的Ajax代碼注釋掉了,有需求做異步網頁顯示可以參考注釋的代碼,無需異步顯示代碼就很簡單啦:
- index.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>ClairJobs</title>
</head>
<body>
<form enctype="multipart/form-data" action="fileManagerUpload/" method="post">
{% csrf_token %}
<input type="file" name="myfile" id="avatar_file"/>
<br/>
<input type="submit" value="upload">
</form>
{#<script src="https://code.jquery.com/jquery-3.1.1.min.js"></script>#}
{#<script>#}
{# $(function () {#}
{#一直使用Ajax上傳#}
{# console.log('Ajax上傳');#}
{# $("#upload").click(function () {#}
{# var formdata = new FormData();#}
{# formdata.append("fname", $("#fname").val());#}
{# formdata.append("lname", $("#lname").val());#}
{# formdata.append("csrfmiddlewaretoken", $("[name='csrfmiddlewaretoken']").val());#}
{# $.ajax({#}
{# url: "/process",#}
{# type: "post",#}
{# data: formdata,#}
{# contentType: false,#}
{# processData: false,#}
{# success: function (data) {#}
{# alert("上傳成功!")#}
{# console.log(data)#}
{# document.getElementById("p1").innerHTML=data.status;#}
{# document.getElementById("fname").value=data.data.name;#}
{# document.getElementById("lname").value=data.data.age;#}
{# alert(data.list)#}
{# },#}
{# error: function (data) {#}
{# alert("上傳失敗!")#}
{# console.log(data)#}
{# }#}
{# })#}
{# })#}
{# });#}
{#</script>#}
</body>
</html>
2x4 視圖層views.py配置
這個就是經典的view視圖了,在這里我們可以根據自己的需要撰寫方法,然后通過urls路由,最終實作views下方法顯示出網頁的效果,
我們要在這里要做最重要的三個事情:
- 根據Get、Post請求顯示網頁
- 上傳檔案
- 呼叫VirusTotal API
- views.py
from django.shortcuts import render, redirect
from django.http import HttpResponse, JsonResponse
from django.conf import settings
import os
import requests
import json
def index(request):
return render(request,'index.html')
def fileManagerUpload(request):
# 檔案上傳
print(request.POST)
print(request.FILES)
if request.method=='GET':
return render(request, 'index.html')
if request.method == 'POST':
myFile = request.FILES.get("myfile", None)
print(myFile)
if not myFile:
return HttpResponse('沒有要上傳的檔案')
destination = open(os.path.join(settings.MEDIA_ROOT, myFile.name), 'wb+')
for chunk in myFile.chunks():
destination.write(chunk)
# 上傳完成后,通過requests 呼叫VirusTotal API
url = '你的API呼叫網址'
params = {'apikey': '你的APIKEY'}
files = {'file': (myFile.name, open(os.path.join(settings.MEDIA_ROOT, myFile.name), 'rb'))}
responseup = requests.post(url, files=files, params=params)
print(responseup.json())
# 下載報告
url = '你的API呼叫網址'
params = {'apikey': '你的APIKEY',
'resource': '你的檔案Hash值'}
responsedown = requests.get(url, params=params)
destination.close()
print(responsedown.json)
return JsonResponse(responsedown.json(),safe=False) #CSRF Token錯誤
return HttpResponse('失敗')
總結 Go與Python的比較
最開始考慮使用Beego實作VirusTotal 的API呼叫,奈何Go語言的 ‘net/http’ 有點不會用,折中方法是在Beego下添加CURL庫再實作介面的呼叫,有些麻煩,經過查資料和各種試錯總結出:Go生而為并發而來,GO更加類似于Python中的協程,適合作為創建API讓別人呼叫,而Go本身去呼叫別人的API就不如Python來的方便,雖然在目前的場景下是不怎么需要考慮性能的,但是后續還要多學習一下Go的高并發以備急需,
~ 看完點贊再走 ~
文章如有錯誤和疏漏,請及時聯系我,謝謝!
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/275155.html
標籤:python
上一篇:第 2 章 基本資料型別
