这个部分按照我个人的理解,就是用户通过浏览你的网页看到的内容。通过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