1. 程式人生 > >web後端--Django學習筆記08

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"/> &nbsp;&nbsp;
    小狗:<input type="radio" name="animal" value="dog"/> &nbsp;&nbsp; <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')),