這裡使用Django+Gunicorn+Nginx的方式簡單運行一個小型webserver,實現一個簡單的上傳文件到服務器的功能(並不生成下載鏈接)。
啟動虛擬環境,安裝django和gunicorn:
pip install Django==2.0
pip install gunicorn
#進入要放置代碼的目錄並新建項目
django-admin startproject mysite
##或者在當前目錄建立項目
#django-admin startproject mysite .
cd mysite
#新建app
python manage.py startapp polls
先建立一個表格:
#polls/forms.py
from django import forms
class UploadFileForm(forms.Form):
title = forms.CharField(label='密碼',max_length=20,widget=forms.PasswordInput)
file = forms.FileField(label='文件',)
修改view:
#polls/views.py
import os
import subprocess
from django.core.files.storage import FileSystemStorage
from django.conf import settings
from django.shortcuts import render
from django.http import HttpResponse
from .forms import UploadFileForm
#handle file example with file
def handle_uploaded_file(f):
with open('/file/should/be/saved/here/target.odt', 'wb+') as destination:
for chunk in f.chunks():
destination.write(chunk)
#another handle file example with filename
def handle_uploaded_file2(filename):
msg=''
try:
targetZipFilePath = os.path.join(settings.BASE_DIR, filename)
cmd1=subprocess.check_call(["unzip", "-o", targetZipFilePath, "-d", "/home/fred/workspace/"])
if cmd1==0 :
cmd2=subprocess.check_call(["cp", "-Rf", "/home/fred/workspace/dist", "/home/fred/"])
if cmd2==0 :
msg="deployed successfully"
else:
msg="error 2"
else:
msg="error 1"
except:
msg = 'error 0'
return msg
def upload_file(request):
if request.method == 'POST':
form = UploadFileForm(request.POST, request.FILES)
if form.is_valid() and request.POST['title']=='Secret':
# handle_uploaded_file(request.FILES['file'])
# return HttpResponse("上傳成功")
myfile = request.FILES['file']
fs = FileSystemStorage()
filename = fs.save(myfile.name, myfile)
uploaded_file_url = fs.url(filename)
print(uploaded_file_url)
res = handle_uploaded_file2(uploaded_file_url)
return HttpResponse(res)
else:
form = UploadFileForm()
return render(request, 'upload.html', {'form': form})
新建一個表格的模板:
#polls/templates/upload.html
<form enctype="multipart/form-data" action="/polls/upload/" method="post">
{% csrf_token %}
{{ form }}
<input type="submit" value="上傳" />
</form>
新建一個url路由表:
#polls/urls.py
from django.urls import path
from . import views
urlpatterns = [
path('upload/', views.upload_file, name='upload_file'),
]
修改項目路由:
#mysite/urls.py
from django.contrib import admin
from django.urls import include,path
urlpatterns = [
path('polls/', include('polls.urls')),
path('admin/', admin.site.urls),
]
修改項目設置:
#mysite/settings.py
INSTALLED_APPS = [
'polls.apps.PollsConfig',
# 'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
# 'django.contrib.messages',
# 'django.contrib.staticfiles',
]
LANGUAGE_CODE = 'zh-Hant'
TIME_ZONE = 'Asia/Taipei'
然後在項目目錄(最上層)運行gunicorn就可以訪問了:
gunicorn mysite.wsgi --bind 127.0.0.1:3040
nginx中增加如下server即可在外網訪問了(鏈接應該是http://YourPublicIP:8081/polls/upload/):
server {
listen 8081;
server_name 127.0.0.1;
charset utf-8;
keepalive_timeout 60s;
#access_log logs/django2a.access.log combined if=$loggable;
location / {
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_redirect off;
if (!-f $request_filename) {
proxy_pass http://127.0.0.1:3040;
break;
}
}
}
CentOS6+Django2+MySql
yum install MySQL-python
pip install mysqlclient
#如果import MySQLdb提示無libmysqlclient.so.18
#則建立軟連接如下
ln -s /usr/local/mysql/lib/libmysqlclient.so.18 /usr/lib64/libmysqlclient.so.18