當Django在處理文件上傳時,文件的數據被存儲在request.FILES屬性中javascript
FILES只有在請求的方法爲POST且提交的form表單帶有enctype="multipart/form-data"
屬性的狀況纔會包含數據。不然,FILES將爲一個空的相似字典的對象html
FILES中的鍵爲input的name屬性值前端
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>文件上傳</title> </head> <body> <form method="post" action="/upfile/" enctype="multipart/form-data"> {% csrf_token %} <input type="file" name="file"> <input type="file" name="file"> <input type="file" name="pic"> <input type="submit" value="上傳"> </form> </body> </html>
在static目錄下建立名爲media的目錄java
配置路徑:python
settingsjquery
# 文件上傳的路徑 MEDIA_URL = '/media/' # 訪問資源的地址如 http://127.0.0.1:5000/media/1.jpg # 寫相對路徑也能夠 MEDIA_ROOT=os.path.join(BASE_DIR,"static/media")
{ 'file': [ <InMemoryUploadedFile: a.txt (text/plain)>, <InMemoryUploadedFile: b.txt (text/plain)> ], 'pic': [ <InMemoryUploadedFile: c.jpg (image/jpeg)> ] }
from django.conf import settings def upfile(request): if request.method == "GET": return render(request, "upfile.html") else: # print(request.FILES) for name in request.FILES: files = request.FILES.getlist(name) # print(files) for file in files: #處理每一個文件 filePath = r"%s\%s"%(settings.MEDIA_ROOT,file.name) with open(filePath, "wb") as fp: # 將文件數據切片寫入描述符 for part in file.chunks(): fp.write(part) return HttpResponse("上傳文件成功")
# 生成縮略圖 from PIL import Image im = Image.open('c.jpg') print(im.format, im.size, im.mode) # JPEG (840, 1024) RGB im.thumbnail((100,200)) im.save("c1.jpg", "JPEG")
from django.core.paginator import Paginator def students(request, num): allStudents = Student.objects.all() #分頁 每頁6條數據 paginator = Paginator(allStudents, 6) print(paginator.count, paginator.num_pages, paginator.page_range) pageStus = paginator.page(num) return render(request, "students.html", {"stus":pageStus})
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>學生信息</title> </head> <body> <h1>學生信息</h1> <ul> {% for stu in stus %} <li>{{ stu.name }}--{{ stu.grade }}--{{ stu.age }}</li> {% endfor %} </ul> {% if stus.has_previous %} <a href="/students/{{ stus.previous_page_number }}">上一頁</a> {% endif %} {% for index in stus.paginator.page_range %} {% if index == stus.number %} {{ index }} {% else %} <a href="/students/{{ index }}/">{{ index }}</a> {% endif %} {% endfor %} {% if stus.has_next %} <a href="/students/{{ stus.next_page_number }}">下一頁</a> {% endif %} </body> </html>
使用視圖經過上下文向模板中傳遞數據,須要先加載完成模板的靜態頁面,再執行模板模型代碼,生成最後的HTML代碼,返回給瀏覽器,這個過程將頁面與數據集成到了一塊兒,擴展性差ajax
經過ajax的方式獲取數據,再經過DOM操做將數據呈現到界面上redis
異步:如發郵件(註冊的時候提示郵件已經發送成功,其實並無) 能提升用戶體驗。 如豆瓣,防止頁面卡死。數據庫
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>展現學生</title> <script type="text/javascript" src="/static/js/jquery-3.1.1.min.js"></script> </head> <body> <button id="btn">顯示學生信息</button> <ul id="stus"> </ul> <script type="text/javascript"> $(document).ready(function () { $("#btn").bind("click", function () { /* $.get("/allStudents/",{"a":1,"b":2},function (data, status) { console.log("************************2"); console.log(data, status); stus = data["data"]; for (var i = 0; i < stus.length; i++){ stu = stus[i]; $li = $("<li>"+stu.name+"---"+stu.age+"</li>"); $("#stus").append($li) } }); */ $.ajax({ url:"/allStudents/", type:"get", data:{"a":1,"b":2,"c":3}, dataType:"json", success:function (data, status) { console.log("************************2"); console.log(data, status); stus = data["data"]; for (var i = 0; i < stus.length; i++){ stu = stus[i]; $li = $("<li>"+stu.name+"&&&"+stu.age+"</li>"); $("#stus").append($li) } } }); console.log("************************1"); }); }); </script> </body> </html>
def allStudents(request): if request.method == "GET": if not request.is_ajax(): return render(request, "allStudents.html") else: stus = Student.objects.all() arr = [] for stu in stus: arr.append({"name":stu.name, "age":stu.age}) return JsonResponse({"data":arr})
安裝:pip install django-tinymce
django
INSTALLED_APPS = [ 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', 'myApp', 'tinymce', ]
TINYMCE_DEFAULT_CONFIG={ 'theme':'advanced', 'width':600, 'height':400 }
from tinymce.models import HTMLField class Article(models.Model): title = models.CharField(max_length=20) content = HTMLField()
admin.site.register(Article)
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>書寫博客</title> <script type="text/javascript" src="/static/tiny_mce/tiny_mce.js"></script> <script type="text/javascript"> tinyMCE.init({ 'mode':'textareas', 'theme':'advanced', 'width':600, 'height':400 }); </script> </head> <body> <form method="post" action="/tinymce/"> {% csrf_token %} <input type="text" name="title" value=""><hr/> <textarea name="article"></textarea><hr/> <input type="submit" value="提交"> </form> </body> </html>
用戶發起request請求,並等待response返回。在本次views中,可能須要執行一段耗時的程序,那麼用戶會等待很長時間,形成很差的用戶體驗
網站每小時須要同步數據(天氣預報信息),可是http是須要觸發的,難道要一個小時請求一次嗎?
使用celery:將耗時的程序放到celery中執行 使用celery定時執行
任務task:就是一個python函數
隊列queue:將須要執行的任務加入隊列中
工人worker:在一個新的進程中負責執行隊列中的任務
代理broker:負責調度,在佈置環境中使用redis
pip install celery==3.1.25 pip install celery-with-redis==3.0 pip install django-celery==3.2.1
INSTALLED_APPS = [ 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', 'myApp', 'tinymce', 'djcelery', ]
#celery import djcelery djcelery.setup_loader() #配置redis數據庫 #redis://:密碼@ip:端口/庫 BROKER_URL='redis://:sunck@127.0.0.1:6379/0' #配置任務文件 CELERY_IMPORTS=("myApp.task")
# 在應用目錄下建立名爲task.py的文件 # -*- coding:utf-8 -*- from celery import task import time @task def longIO(): print("開始耗時操做……") time.sleep(5) print("結束耗時操做……")
python manage.py migrate
生成celery所須要的表
將已存在的celery.py添加到工程目錄下的與工程目錄同名的目錄下
celery.py
from __future__ import absolute_import import os from celery import Celery from django.conf import settings os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'whthas_home.settings') app = Celery('portal') app.config_from_object('django.conf:settings') app.autodiscover_tasks(lambda: settings.INSTALLED_APPS) @app.task(bind=True) def debug_task(self): print('Request: {0!r}'.format(self.request))
在工程目錄下的與工程目錄同名的目錄中的__init__.py文件中添加from .celery import app as celery_app
from myApp.task import longIO def registe(request): longIO.delay() return HttpResponse("sunck is a good man")
redis-server.exe redis.windows.conf
python manage.py celery worker --loglevel=info
python manage.py runserver