django进阶(六)之cbv和fbv 装饰器应用
视图函数views.py
from django.shortcuts import render # Create your views here. from django.shortcuts import HttpResponse from django.shortcuts import redirect import os from django.urls import reverse from cmdb import models from django.utils.safestring import mark_safe from utils import pagination from django import views def auth(func): def inner(request,*args,**kwargs): v = request.COOKIES.get('uname') if not v: return redirect('/cmdb/login/') return func(request,*args,**kwargs) return inner def login(request): error_msg = "" # if request.method == "GET": # return render(request,'login.html') # elif request.method == "POST": # u = request.POST.get('user') # p = request.POST.get('password') # ##如果数据库里有多个相同的数据,取第一个,如果没有就会显示none # obj = models.UserInfo.objects.filter(username=u,password=p).first() # # #①、判断条件:如果obj为none,则用户不存在或密码错误,如果不为none则存在 # #②、判断个数,count = obj = models.UserInfo.objects.filter(username=u,password=p).count() # if obj: # return redirect('/cmdb/index/') # else: # error_msg = "用户名密码错误" # return render(request,'login.html',{'error_msg' : error_msg}) ####test_cookie######### if request.method == 'GET': return render(request,'login.html') elif request.method == "POST": u = request.POST.get('user') p = request.POST.get('password') ##如果数据库里有多个相同的数据,取第一个,如果没有就会显示none obj = models.UserInfo.objects.filter(username=u,password=p).first() if obj: ##如果存在数据(不为空)则正确 res = redirect('/cmdb/index/') res.set_cookie('uname',u) return res else: error_msg = "用户名密码错误" return render(request,'login.html',{'error_msg' : error_msg}) # def login_test(request): # if request.method == "GET": # return render(request,'login.html') # elif request.method == "POST": # u = request.POST.get('user') # p = request.POST.get('password') # ##如果数据库里有多个相同的数据,取第一个,如果没有就会显示none # obj = models.UserInfo.objects.filter(username=u,password=p).first() # # #①、判断条件:如果obj为none,则用户不存在或密码错误,如果不为none则存在 # #②、判断个数,count = obj = models.UserInfo.objects.filter(username=u,password=p).count() # if obj: # return redirect('/cmdb/index/') # else: # error_msg = "用户名密码错误" # return render(request,'login.html',{'error_msg' : error_msg}) def index(request): v = request.COOKIES.get('uname') return render(request,'index.html',{'current_user':v}) def userinfo(request): if request.method == 'GET': userlist = models.UserInfo.objects.all() group_list = models.UserGroup.objects.all() return render(request,'userinfo.html',{'userlist':userlist,'grouplist':group_list}) elif request.method == 'POST': u = request.POST.get('username') p = request.POST.get('password') role = request.POST.get('group_id') #print (role) models.UserInfo.objects.create(username=u,password=p,user_group_id=role) return redirect('/cmdb/userinfo') def usergroup_info(request): pass def user_detail(request,uid): userdetail = models.UserInfo.objects.filter(id=uid) ###当上面为first时,userdetail.html用户详细信息下面的值就不能用循环了 ##userdetail.query 可以打印sql语句 models.UserInfo.objects.get(id=uid) 另一种取值方法,不存在会报错 return render(request,'userdetail.html',{'userdetail':userdetail}) def user_del(request,uid): models.UserInfo.objects.filter(id=uid).delete() return redirect('/cmdb/userinfo') def user_edit(request,uid): if request.method == 'GET': user_infomation = models.UserInfo.objects.filter(id=uid) return render(request,'edit.html',{"user_infomation":user_infomation}) elif request.method == 'POST': user_id = request.POST.get('id') uname = request.POST.get('username') pwd = request.POST.get('password') models.UserInfo.objects.filter(id=user_id).update(username=uname,password=pwd) return redirect('/cmdb/userinfo') def orm(request): models.UserInfo.objects.create( username = 'roo12', password = 'root123', email = 'aaa', test = 'test', user_group_id = 1 ) return HttpResponse('orm') # USRE_LIST = [] # # def home(request): # if request.method == 'POST': # uname = request.POST.get('username') # email = request.POST.get('email') # gender = request.POST.get('gender') # user_dic = {'u':uname,'e':email,'gender':gender} # USRE_LIST.append(user_dic) # return render(request,'home.html',{'user_list':USRE_LIST}) # # def login(request): # # if request.method == "GET": # return render(request,'login.html') # ####用户名密码验证操作 # elif request.method == "POST": # ###获取选择的值 # # v = request.POST.getlist('upload') ###此处的upload为login.html里文件上传标签的属性值 # # print (v) ###传一个图片,默认情况下获得的为图片的名称 # file = request.FILES.get('upload') # file_path = os.path.join('upload',file.name) # f = open(file_path,mode='wb') # for i in file.chunks(): # f.write(i) # f.close() # from django.core.files.uploadedfile import InMemoryUploadedFile # return render(request, 'login.html') # # else: # return redirect(request,'/login') # user_list = { # '1' : {'username':"root1",'email':"aa@aa.com",'passwd':"aaaa"}, # '2' : {'username':"root2",'email':"aa@aaa.com",'passwd':"aaaqa"}, # '3' : {'username':"root3",'email':"aa@aaaa.com",'passwd':"aaaaaa"}, # } # # # def detail(request,nid,uid): # print (request.path_info) # # v = reverse('detail',args=(90,80,)) # print (v) # return render(request, 'detail.html') # detail_info = user_list[nid] # # return render(request,'detail.html',{'detail_info':detail_info}) # class Home(View): # # ##此处为在执行get和post函数之前要做的事(自定义的功能),程序执行时,会通过View下的dispatch函数来判断请求是get方法还是post方法 # #然后去执行相应的函数,此处相当于在判断请求方法之前自定义功能 # def dispatch(self, request, *args, **kwargs): # print('before') # ###下面为调用父类的dispatch方法 # result = super(Home,self).dispatch(request,*args, **kwargs) # print('after') # return result # # def get(self,request): # # print(request.method) # return render(request,'test.html',{'user_dict':user_list}) # # # def post(self,request): # # print (request.method,'post') # return render(request,'test.html',{'user_dict':user_list}) # def orm(request): # # ###创建用户① # #models.UserInfo.objects.create(username="root",password="123456") # # ###创建用户②、 # # #dict = {"username":"test","password":"test"} # #models.UserInfo.objects.create(**dict) # # ###创建用户③、 # # obj = models.UserInfo(username='testgao',password='testgao') # # obj.save() # # ##查询数据 # # # result = models.UserInfo.objects.all() # # print (result) # # # # for row in result: # # print (row.id,row.username,row.password) # # result1=models.UserInfo.objects.filter(username='root') # # print (result1) # # return HttpResponse('orm') # # ###删除 # # # models.UserInfo.objects.all().delete() # # models.UserInfo.objects.filter('id=2').delete() # # ##改 # models.UserInfo.objects.all().update(password='aaa') # # models.UserInfo.objects.filter(id='3').update(password='32432') def test(request,name): return HttpResponse(name) def test_fun(request): name = 'EWREREWFDAfdsa' return render(request,'test_fun.html',{'name':name}) list = [] for i in range(1090): list.append(i) def page(request): current_page = request.GET.get('p', 1) current_page = int(current_page) # val = request.COOKIES.get('per_page_count', 10) # val = int(val) val = request.COOKIES.get('per_page_count') #request.get_signed_cookie('key',salt='dfdsa') #解密时也要加上加密时用的salt参数及相同的salt值 val = int(val) page_obj = pagination.Page(current_page, len(list), val) data = list[page_obj.start:page_obj.end] page_str = page_obj.page_str("/cmdb/page/") return render(request,'page.html',{'li':data,'page_str':page_str}) ##li为数据内容,page_str 为页数 # current_page = request.GET.get('p',1) ##获取p的值 # current_page=int(current_page) ##转化为整型 # # start = (current_page - 1 ) * 10 ###起始内容页数 # end = current_page * 10 ##结束内容页数据量 # # data = list[start:end] # # all_count = len(list) ##所有数据 # count,y = divmod(all_count,10) ##divmod函数用来整除取余 # # if y: ##如果y为不为0,则说明有余数,页数要加1来显示超过整除的部分的 # count +=1 # # page_list = [] # for i in range(1,count+1): ##总页数 # if i == current_page: # temp = '<a class="page active" href="/cmdb/page/?p=%s">%s</a>' % (i,i) ##添加html模版,如果 # else: # temp = '<a class="page" href="/cmdb/page/?p=%s">%s</a>' % (i,i) # # page_list.append(temp) # # page_str = mark_safe("".join(page_list)) ##此步是为了安全的使page_list的值传入到html中正常显示,而不是显示为字符串 # return render(request,'page.html',{'li':data,'page_str':page_str}) ##li为数据内容,page_str 为页数 from django.utils.decorators import method_decorator @method_decorator(auth,name="dispatch") ##方法③ class order(views.View): #方法② # @method_decorator(auth) ##因为会首先执行dispatch函数,如果这里不通过,下面的函数没法执行,所以可把装饰器放到这里 # def dispatch(self, request, *args, **kwargs): # return super(order,self).dispatch(self,request,*args,**kwargs) ##@method_decorator(auth) 方法① def get(self,request): v = request.COOKIES.get('uname') return (request,'index.html',{'current_user':v}) def post(self,request): v = request.COOKIES.get('uname') return (request,'index.html',{'current_user':v})
装饰器函数
fbv
def auth(func): def inner(request,*args,**kwargs): v = request.COOKIES.get('uname') #获取cookies if not v: #验证cookies是否存在 return redirect('/cmdb/login/') return func(request,*args,**kwargs) ##这里return 函数加了括号表示执行了函数,不加括号不执行 return inner


cbv
from django import views from django.utils.decorators import method_decorator @method_decorator(auth,name="dispatch") ##方法③ class order(views.View): #方法② # @method_decorator(auth) ##因为会首先执行dispatch函数,如果这里不通过,下面的函数没法执行,所以可把装饰器放到这里 # def dispatch(self, request, *args, **kwargs): # return super(order,self).dispatch(self,request,*args,**kwargs) ##@method_decorator(auth) 方法① def get(self,request): v = request.COOKIES.get('uname') return (request,'index.html',{'current_user':v}) def post(self,request): v = request.COOKIES.get('uname') return (request,'index.html',{'current_user':v})


浙公网安备 33010602011771号