這裡使用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