Python+Django+SQLite 製作TO-DO list(四、視圖邏輯部分views)

這個部分按照我個人的理解,就是用戶通過瀏覽你的網頁看到的內容。通過views中的一系列指令從數據庫中獲取所需的數據,並通過template的渲染,最終到達用戶的設備中。當讓用戶與你數據庫的通信也是通過這部分完成,比如保存用戶名、用戶信息等。

這一部分也是Django中比較重要的一部分,因爲用戶可以通過這個部分來與你的數據庫進行比較直接的交互。一般views部分包含用戶的註冊、登陸、查看文章等等功能,一般上你能看到的所有的東西都是從views過來的

下面對代碼進行分析

views.py

一、導入相關包

from django.db.models import Q
from django.contrib.auth.backends import ModelBackend
from django.shortcuts import render
from django.views.generic.base import View
from .models import UserProfile,UserTodo,UserMessage
from .forms import RegisterForm,LoginForm
from django.views.decorators.csrf import csrf_exempt
from django.contrib.auth.hashers import make_password
from django.contrib.auth import authenticate,login,logout
from django.urls import reverse
from django.http import HttpResponse,HttpResponseRedirect
import re
from datetime import datetime

二、自定義用戶驗證函數

class MyBackend(ModelBackend):
    def authenticate(self,username=None,password=None,**kwargs):
        try:
            user = UserProfile.objects.get(Q(username=username)|Q(email=username))
            if user.check_password(password):
                return user
        except Exception as e:
            return None

利用自定義的驗證函數可以實現用戶名與用戶註冊時所用的郵箱都能登陸,導入Q文件是對數據庫進行固定條件查詢即username或email。

調用過程爲:Django按照用戶輸入的username或emai在數據庫中查詢,然後再將用戶輸入的密碼與數據庫中的密碼進行比對,若密碼正確,則返回user對象,若錯誤則返回None

個人認爲自定義的用戶驗證函數的複用性比較強,幾乎所有的網站都可以按照這種模式進行用戶驗證。

三、頁面編寫

1、用戶註冊界面

class RegisterView(View):
    def get(self,request):
        register_form = RegisterForm()
        return render(request,'register.html',{'register_form':register_form})
    def post(self,request):
        register_form = RegisterForm(request.POST)
        if register_form.is_valid():
            email = request.POST.get('user_email','') #否則爲空
            username = request.POST.get('user_name','')
            if UserProfile.objects.filter(username=username):
                return render(request,'register.html',{'register_form':register_form,'msg_user':'用戶已存在!'})
            if UserProfile.objects.filter(email=email):
                return render(request,'register.html',{'register_form':register_form,'msg_email':'該郵箱已經註冊!'})
            password = request.POST.get('password1','')
            user_profile = UserProfile()
            user_profile.username = username
            user_profile.email = email
            user_profile.password = make_password(password)
            user_profile.is_active = True #判斷用戶是否激活
            user_profile.save()
            return render(request,'success.html')
        return render(request,'register.html',{'register_form':register_form})

用戶的請求分爲get與post:

按照字面的理解就是用戶向服務器要網頁(數據)與用戶向服務器傳遞數據。當用戶訪問一個網頁時可以大致的理解爲get,當用戶完成一定的操作,比如說完成註冊後,點擊註冊按鈕,這時便是post

當Django判定是get後便return render(request,'register.html',{'register_form':register_form})(對網頁進行渲染並返回該網頁);同理若爲post,先對用戶post的數據進行加工與處理,然後便return render(request,'register.html',{'register_form':register_form})

這裏涉及到用戶註冊時的數據庫的操作,《Django對數據庫進行添加與更新》裏有相關說明

剩下的頁面也都大同小異,這裏就不做過多的介紹。

不過要注意的是錯誤網頁的顯示,它採用的是全局函數,代碼如下:

#全局404 函數
def page_not_found(request):
    from django.shortcuts import render_to_response
    response = render_to_response('404.html', {})
    response.status_code = 404
    return response

#全局500 函數
def page_error(request):
    from django.shortcuts import render_to_response
    response = render_to_response('500.html', {})
    response.status_code = 500
    return response

2、前端與後端交互時用到的函數

當用戶完成一項數據的編寫並提交到服務器時,一般來說是按照post方式,但這樣做會造成頁面的刷新,一條兩條還行,要是像網頁版微信一樣,有一條消息就刷新一次網頁,眼睛豈不是要瞎了(手動滑稽),這時就要用到ajax了,ajax一般都是在js文件中,這裏列出一個在views中的與ajax交互的函數

#將用戶添加的todo保存到數據庫中,加裝飾符爲了防止csrf對其進行攔截
@csrf_exempt
def save_todo(request):
    if request.method == 'POST':
        user_email = UserProfile.objects.get(username=request.user)
        print(user_email)
        done = False
        try:
            todo = request.POST.get('todo')#獲取從前端返回的數據
            if todo is not None:
                user_todo = UserTodo(ToDolist=todo,done=done,user_email=user_email,deadline=datetime.now())
                user_todo.save()
        except Exception as e:
            print(e)

該函數的功能是通過前端利用ajax函數傳過來的數據,Django將其保存到數據庫中,這個過程並不會刷新網頁(嚴格說刷新了部分的網頁,不然內容怎麼顯示的)

好了這部分到此結束

再次貼上我的github地址:https://github.com/Prolht/mysite-todo-list

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章