web後端--Django學習筆記08
一、第七天作業
1.有兩個單選按鈕,選擇“小貓”單選按鈕,則下方顯示小貓圖片, 選擇“小狗”單選按鈕,則下方顯示小狗圖片,要求使用jQuery實現Ajax, 根據前臺選擇的資料從後臺傳送圖片地址。
1.1程式碼演示
1、settings
STATIC_URL = '/yourpet/' STATICFILES_DIRS = [ os.path.join(BASE_DIR,'static_resources'), os.path.join(BASE_DIR,'upload'), ]
2、templates
<!animal.html> <!DOCTYPE html> {% load static %} <html lang="en"> <head> <meta charset="UTF-8"> <title>Ajax訪問圖片</title> <script src="{% static 'js/jquery-3.1.1.js' %}"></script> <script type="text/javascript"> $(function(){ $("input[name=animal]").change(function(){ if($(this).prop("checked")){ $.ajax({ url:'/homework/animal/'+$(this).val()+"/", success:function(data){ var pic_path=data.imgpath; var color = data.color; var info = data.info; $("#animal_pic").prop("src",pic_path); $("#msg").css("color",color).html(info); } }); } }); }) </script> </head> <body> 小貓:<input type="radio" name="animal" value="cat" checked="checked"/> 小狗:<input type="radio" name="animal" value="dog"/> <br/> <img src="{% static 'images/cat.jpg' %}" id="animal_pic"/> <br/> <span id="msg"></span> </body> </html>
3、views
from django.http import JsonResponse from django.shortcuts import render def go_animal(request): return render(request,'homework/animal.html') def send_animal(request,pet): if pet == "cat": return JsonResponse({"imgpath":"/yourpet/images/cat.jpg","color":"green","info":"可愛的小貓"}) #HttpRsponse子類,返回js物件 else: return JsonResponse({"imgpath": "/yourpet/images/dog.jpg", "color": "blue","info":"漂亮的小狗"})
4、urls
#子路由 from django.urls import path from homework.views import * app_name = "homework" urlpatterns = [ path('go/',go_animal), path('animal/<pet>/',send_animal,name="pet"), ] #總路由 path('homework/',include('homework.urls',namespace="home")),
二、擴充套件Django自帶認證系統
第一步: 自定義一個模型類,繼承AbstractUser,則該模型類既擁有Django認證系統 的操作方法,又可以擴充套件自定義屬性。
第二步:在settings.py中設定AUTH_USER_MODEL,將其設定為:AUTH_USER_MODEL = "app名稱.自定義模型類名"
AUTH_USER_MODEL = "authapp.MyUser"補充:使用@login_required裝飾器裝飾的檢視函式,只有在使用者登入的情況下才能呼叫,否則,則未登入使用者被重定向到settings.py中配置的LOGIN_URL指定的路由地址;或者通過@login_required(login_url="未登入重定向地址")設定。
LOGIN_URL = "/authapp/nologin/" # 未登入使用者跳轉路徑
2.1 程式碼演示
1、models
from django.contrib.auth.models import AbstractUser from django.db import models class MyUser(AbstractUser): tel = models.CharField(max_length=20) qq = models.CharField(max_length=15) wechat = models.CharField(max_length=20) class Meta: db_table = "myusers"
2、views
from django.contrib.auth import authenticate, login, logout from django.contrib.auth.decorators import login_required from django.shortcuts import render, redirect from django.urls import reverse from authapp.models import MyUser def go_register(request): return render(request,'authapp/register.html') def go_login(request): return render(request, 'authapp/login.html') def wrong_login(request,msg): return render(request, 'authapp/login.html',locals()) @login_required #裝飾器, 未登入不能呼叫該函式 def go_success(request): return render(request,'authapp/success.html') def no_login(request): return render(request,'authapp/login.html',{"msg":"您還未登入,請先登入!"}) # 註冊 def register(request): regname = request.POST["regname"] regpwd = request.POST["regpwd"] regtel = request.POST["regtel"] regqq = request.POST["regqq"] regwechat = request.POST["regwechat"] MyUser.objects.create_user(username=regname,password=regpwd,tel=regtel,qq=regqq,wechat=regwechat) return redirect(reverse("auth:gologin")) #重定向 # 登入 def myuser_login(request): logname = request.POST["logname"] logpwd = request.POST["logpwd"] user = authenticate(username=logname,password=logpwd) # 驗證使用者名稱和密碼是否正確 if user is not None: login(request,user) # 將使用者與Session關聯,登陸 return redirect(reverse("auth:success")) #跳到成功頁面 else: return redirect(reverse("auth:wrong",args=("使用者名稱或密碼錯誤,請重新輸入",))) # 登出 def myuser_logout(request): logout(request) return redirect(reverse("auth:gologin"))
3、templates
<!register.html> <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>註冊頁面</title> </head> <body> <form action="{% url 'auth:reg' %}" method="post"> {% csrf_token %} 註冊使用者名稱:<input type="text" name="regname"/> <br/> 註冊密碼:<input type="password" name="regpwd"/> <br/> 聯絡電話:<input type="text" name="regtel"/> <br/> QQ:<input type="text" name="regqq"/> <br/> 微訊號:<input type="text" name="regwechat"/> <br/> <input type="submit" value="註冊"/> </form> </body> </html>
<!goloin.html> <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>登入頁面</title> </head> <body> <h3 style="color:red"> {{ msg }} </h3> <form action="{% url 'auth:login' %}" method="post"> {% csrf_token %} 使用者名稱:<input type="text" name="logname"/> <br/> 密碼:<input type="password" name="logpwd"/> <br/> <input type="submit" value="登入"/> </form> </body> </html>
<!succcess.html> <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>成功頁面</title> </head> <body> <h3>恭喜,<span style="color:blue">{{ request.user.username }},訪問本網站~~~ </span></h3> <a href="{% url 'auth:logout' %}">登出</a> </body> </html>
4、urls
#子路由 from django.urls import path from authapp.views import * app_name = "authapp" urlpatterns = [ path('goreg/',go_register), path('gologin/',go_login,name="gologin"), path('wronglogin/<msg>/',wrong_login,name="wrong"), path('nologin/',no_login,name="nologin"), path('gosuccess/',go_success,name="success"), path('register/',register,name="reg"), path('login/',myuser_login,name='login'), path('logout/',myuser_logout,name="logout"), ] #總路由 from django.contrib import admin from django.urls import path,include urlpatterns = [ path('admin/', admin.site.urls), path('authapp/',include('authapp.urls',namespace='auth')), ]
三、檔案上傳
1. 上傳檔案所在的表單必須設定enctype="multipart/form-data"。 2. 後臺接收,獲取上傳檔案物件:upload_file = request.FILES.get("檔案域名稱") 3. 分塊寫入伺服器: for chunk in upload_file.chunks(): # 將上傳檔案分塊寫入目標路徑 目標檔案.write(chunk) # 分塊寫入
1.1 發程式碼演示
1、views
from django.http import HttpResponse from django.shortcuts import render, redirect import os,uuid from django.urls import reverse BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) def go_upload(request): return render(request,'uploadapp/upload.html') def go_success(request,picpath): return render(request,'uploadapp/success.html',locals()) def upload(request): upload_file = request.FILES.get("upload_file") # 接收上傳檔案,通過表單域的名稱獲取上傳檔案 dest_file_path = os.path.join(BASE_DIR,'upload','images',upload_file.name) # 拼接上傳到的目標檔案路徑 with open(dest_file_path,'wb') as f: for chunk in upload_file.chunks(): # 將上傳檔案分塊寫入目標路徑 f.write(chunk) # 分塊寫入 pic_path = "images/" + upload_file.name return redirect(reverse("uploadapp:success",args=(pic_path,)))
2、templates
<!templates/uploadapp/upload.html> <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>上傳檔案</title> </head> <body> <form action="{% url 'uploadapp:upload' %}" method="post" enctype="multipart/form-data"><!以資料流形式上傳> {% csrf_token %} <input type="file" name="upload_file"/> <br/> <input type="submit" value="點選上傳"/> </form> </body> </html>
<!templates/uploadapp/success.html> <!DOCTYPE html> {% load static %} <html lang="en"> <head> <meta charset="UTF-8"> <title>上傳成功頁面</title> </head> <body> <h3>您上傳的圖片是:</h3> <img src="{% static picpath %}"/> </body> </html>
3、urls
#子路由 from django.urls import path from uploadapp.views import * app_name = "uploadapp" urlpatterns = [ path('goupload/',go_upload), path('gosuccess/<path:picpath>/',go_success,name="success"), path('uploadfile/',upload,name="upload"), ] #總路由 from django.contrib import admin from django.urls import path,include urlpatterns = [ path('admin/', admin.site.urls), path('uploadapp/',include('uploadapp.urls',namespace="uploadapp")),
四、Memcached快取
檔案安裝下載地址:http://www.runoob.com/Memcached/window-install-memcached.html
1、memcached <1.4.5 版本安裝
1、解壓下載的安裝包到指定目錄。
2、在 1.4.5 版本以前 memcached 可以作為一個服務安裝,使用管理員許可權執行以下命令:
c:\memcached\memcached.exe -d install
注意:你需要使用真實的路徑替代 c:\memcached\memcached.exe。
3、然後我們可以使用以下命令來啟動和關閉 memcached 服務:
c:\memcached\memcached.exe -d start c:\memcached\memcached.exe -d stop
4、如果要修改 memcached 的配置項, 可以在命令列中執行 regedit.exe 命令開啟登錄檔並找到 "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\memcached" 來進行修改。
如果要提供 memcached 使用的快取配置 可以修改 ImagePath 為:
"c:\memcached\memcached.exe" -d runservice -m 512
-m 512 意思是設定 memcached 最大的快取配置為512M。
此外我們還可以通過使用 "c:\memcached\memcached.exe -h" 命令檢視更多的引數配置。
5、如果我們需要解除安裝 memcached ,可以使用以下命令:
c:\memcached\memcached.exe -d uninstall
2、memcached >= 1.4.5 版本安裝
1、解壓下載的安裝包到指定目錄。
2、在 memcached1.4.5 版本之後,memcached 不能作為服務來執行,需要使用任務計劃中來開啟一個普通的程序,在 window 啟動時設定 memcached自動執行。
我們使用管理員身份執行以下命令將 memcached 新增來任務計劃表中:
schtasks /create /sc onstart /tn memcached /tr "'c:\memcached\memcached.exe' -m 512"
注意:你需要使用真實的路徑替代 c:\memcached\memcached.exe。
注意:**-m 512** 意思是設定 memcached 最大的快取配置為512M。
注意:我們可以通過使用 "c:\memcached\memcached.exe -h" 命令檢視更多的引數配置。
3、如果需要刪除 memcached 的任務計劃可以執行以下命令:
schtasks /delete /tn memcached
3、python安裝memcached
Memcached是一個基於記憶體的快取框架(服務)。 1.安裝Windows版的Memcached: 切換到含有memcached.exe檔案的目錄,執行命令: memcached -d install 2.啟動memcached服務 net start "Memcached Server" 3.安裝Python操作Memcached的繫結程式 pip install python-memcached 4.在Django配置檔案setttings.py中新增配置: CACHES = { 'default': { 'BACKEND': 'django.core.cache.backends.memcached.MemcachedCache', 'LOCATION': '127.0.0.1:11211', } }
#注意:Memcached可以在多臺伺服器上共享快取,通過LOCATION指定多臺機器的地址和埠 #例如: CACHES = { 'default': { 'BACKEND': 'django.core.cache.backends.memcached.MemcachedCache', 'LOCATION': [ '172.19.26.240:11211', '172.19.26.242:11211', ] } }
1.1 程式碼演示
1、views
import memcache from django.shortcuts import render from memcachedapp.models import Product def get_product(request,product_id): mc = memcache.Client(["localhost:11211",]) # 獲取代表memcache伺服器的連線池物件 product = mc.get("product:"+product_id) # 從Memcache獲取一個Product物件 if product: msg = "快取命中了,以下為從快取中查出的資料:" else: product = Product.objects.get(id=product_id) # 從MySQL資料庫中查資料 mc.set("product:"+str(product.id),product,30) # 將資料儲存到Memcached msg = "以下是從MySQL中查詢的:" return render(request, 'memcachedapp/product.html', locals())
2、templates
<!/teplates/memcached/products.html> <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>產品資訊</title> </head> <body> <h3 style="color:red"> {{ msg }} </h3> <ul> <li>產品編號:{{ product.id }} </li> <li>產品名稱:{{ product.name }} </li> <li>產品價格:{{ product.price }} </li> </ul> </body> </html>
3、models
from django.db import models class Product(models.Model): name = models.CharField(max_length=20,verbose_name="產品名稱") price = models.FloatField(verbose_name="價格") def __str__(self): return self.name class Meta: db_table = "products" verbose_name_plural = "產品模型"
4、urls
#子路由 from django.urls import path from memcachedapp.views import * urlpatterns = [ path('product/<product_id>/',get_product), ] #總路由 from django.contrib import admin from django.urls import path,include urlpatterns = [ path('admin/', admin.site.urls), path('memcached/',include('memcachedapp.urls')),