# 子应用的views.py此文件用于编写Web应用视图,处理复杂的业务逻辑

#导入方法视图模板
from django.shortcuts import render
#导包
from django.http import HttpResponse,HttpResponseRedirect,JsonResponse
#导入类视图
from django.views import View
#从配置文件已安装的django应用模块导入数据库类
from mysite.models import User
from supermarket.models import Product
#导入json
import json
#导入时间模块
import time
#导入源生sql连接
from django.db import connection #导入通用类视图装饰器
from django.utils.decorators import method_decorator #定义一个用cookie验证登录的装饰器decorator
#用session验证登录的装饰器只需换下变量名,在注销功能改下即可
def cookie(func):
def wrapper(request,*args,**kwargs):
login = request.COOKIES.get("username",False)
if not login:
return HttpResponseRedirect('/supermarket/login')
return func(request,*args,**kwargs)
return wrapper #定义反爬装饰器,定义形参,一秒允许请求一次
def limit(seconds=1):
#定义内部方法
def rate_limit(func):
def func_limit(request):
#获取当前时间
now = time.time()
ip = request.META.get('REMOTE_ADDR')
print(int(now))
print(ip)
print('- '*50)
#获取首次来访时间
request_time = request.session.get('req_time',0)
print(request_time)
_ip = request.session.get('ip',ip)
print(_ip)
#做减法
in_time = int(now) - request_time #判断访问者在一秒内来了不止一次
if in_time < seconds and ip == _ip:
#抛出异常,使用第二个参数来指定异常
return HttpResponse('你是爬虫,不要来了',status = 403)
else:
#存储第一次请求时间
request.session['req_time'] = time.time()
request.session['ip'] = ip
#让访问者继续访问
ret = func(request)
return ret
return func_limit
return rate_limit # Create your views here.
#定义注册逻辑类视图
class Reg(View): #定义注册接收方法
def post(self,request): #等待时间
time.sleep(1) #接收参数
username = request.POST.get('username','未收到username值')
password = request.POST.get('password','未收到password值') #注册入库逻辑
#先验证用户唯一性
res = User.objects.filter(username=username).count()
if res > 0:
# #该用户名已被注册
# #将dict强转为json数据
# data = json.dumps({'msg':'该用户名已被注册'},ensure_ascii=False)
# #声明返回网页头部信息为json类型
# return HttpResponse(data,content_type='application/json')
return JsonResponse({'msg':'该用户名已被注册'})
else:
#入库
#实例化一个对象
user = User(username=username,password=password)
#保存
user.save()
# #将dict强转为json数据
# data = json.dumps({'msg':'恭喜您,注册成功'},ensure_ascii=False)
# return HttpResponse(data,content_type='application/json')
return JsonResponse({'msg':'恭喜您,注册成功'},safe=False) #为登录页面加上图形验证码的验证逻辑
from PIL import ImageDraw
#导入绘图字体库
from PIL import ImageFont
#到导入图片库
from PIL import Image
import io,random
#定义随机颜色方法
def get_random_color():
R = random.randrange(255)
G = random.randrange(255)
B = random.randrange(255)
return (R,G,B)
#定义随机验证码
def test_captcha(request):
#定义背景颜色
bg_color = get_random_color()
#定义画布大小,宽 高
img_size = (150,80)
#定义画笔,颜色中类,画布,背景颜色
image = Image.new('RGB',img_size,bg_color)
#定义画笔对象 ,图片对象,颜色类型
draw = ImageDraw.Draw(image,"RGB")
#定义随机字符
source = '0123456789qwertyuiopasdfghjklzxcvbnm'
#定义四个字符
#定义容器,用来接收随机字符串
code_str=""
for i in range(4):
#获取随机颜色
text_color = get_random_color()
#获取随机字符串
tmp_num = random.randrange(len(source))
#获取字符集
random_str =source[tmp_num]
#将随机生成的字符串添加到容器中
code_str += random_str
#将字符画动画布上 坐标,字符串,字符串颜色,字体
#先导入系统字体
my_font = ImageFont.truetype("c:\\Windows/Fonts/consolai.ttf",30)
draw.text((10+30*i,20),random_str,text_color,font=my_font)
#使用io获取一个缓存区
buf= io.BytesIO()
#将图片保存到缓存区 透明图片
image.save(buf,'png') #将随机码存储到session中,用于登录认证
request.session['code'] = code_str #第二个参数声明头部信息
return HttpResponse(buf.getvalue(),'image/png') #定义登录逻辑类视图
class Login(View): #定义登录方法
def post(self,request): # time.sleep(2) #接收参数
username = request.POST.get('username','未收到username值')
password = request.POST.get('password','未收到password值')
code = request.POST.get('code','未收到code值') #判断
res = User.objects.filter(username=username,password=password).count() #测试中文用户名
# return HttpResponse(res) if res > 0 and code == request.session['code']:
#登录成功
response = HttpResponse('登陆成功')
#对中文用户名编码
username = bytes(username,'utf-8').decode('ISO-8859-1')
#存入cookie request.COOKIES.get('username')
response.set_cookie('username',username,max_age=3600)
response.set_cookie('password',password,max_age=3600)
#用户名存入session
request.session['username'] = username
return response
elif res > 0 and code != request.session['code']:
return HttpResponse('验证码输入有误,请重新输入!')
else:
#登录失败,防止暴力破解
return HttpResponse('您输入的用户名或者密码错误,请重新输入!') #定义注销功能
class Logout(View):
#定义注销方法
def get(self,request):
#建立response对象
response = HttpResponseRedirect('/supermarket/login')
#删除cookie
response.delete_cookie('username')
response.delete_cookie('password')
# #删除session
# del request.session['username']
return response # 定义商品列表页混合视图
class ProductList(View): @method_decorator(cookie)
#客户端get请求
def get(self,request):
infos = Product.objects.all()
print(infos)
username = request.COOKIES.get('username','未登录')
#对中文用户名解码
try:
username = username.encode('ISO-8859-1').decode('utf-8')
except Exception as e:
print(e)
pass
#渲染模板
return render(request,'supermarket/productList.html',locals()) #商品入库
class Add(View): def post(self,request):
name = request.POST.get('name')
price = request.POST.get('price')
#只让不同的商品入库
ret = Product.objects.filter(name=name,price=int(price)).count()
if ret == 0:
sql = Product(name=name,price=int(price))
sql.save()
return HttpResponse('入库成功')
else:
return HttpResponse('该商品已存在') #定义商品删除操作
class ProDel(View): def post(self,request):
#接受参数
id = request.POST.get('id')
id=int(id)
#删除操作
Product.objects.filter(id=id).delete()
return HttpResponse('删除成功') #修改操作
class ProEdit(View): def post(self,request):
id = request.POST.get('id')
id=int(id)
name = request.POST.get('name')
price = request.POST.get('price')
price=int(price)
#修改
Product.objects.filter(id=id).update(name=name,price=price)
return HttpResponse('修改成功') #添加购物车操作
class AddCart(View): def post(self,request):
id = request.POST.get('id')
id = int(id)
#判断购物车,是否存在
# cartlist = request.session.get('cartlist',0) #获取session的用户名的购物车
username = request.session.get('username')
cartlist = request.session.get(username,0) #如果没有购物车,就创建后添加
if cartlist == 0:
clist = []
clist.append(id)
# request.session['cartlist'] = clist
request.session[username] = clist
#如果有购物车
else:
#取出购物车
# slist = request.session['cartlist']
slist = request.session[username]
#id直接存入购物车
slist.append(id)
#把购物车重新放入session
# request.session['cartlist'] = slist
request.session[username] = slist return HttpResponse('成功加入购物车') #购物车列表页
class CartList(View): def get(self,request):
# del request.session['cartlist'] # cartlist = request.session.get('cartlist',0) #获取个人购物车
username = request.session.get('username',0)
cartlist = request.session.get(username,0) #查询商品数据库的id字段
idlist = Product.objects.raw("select id from product")
#对象列表嵌套数据,用列表推导式和对象.属性,生成id列表
idlist = [ x.id for x in idlist]
# print(idlist) #购物车为空或没有创建购物车
if cartlist != 0 and cartlist != []:
#准备传给前端的数据
context = []
for i in cartlist:
#判断购物车的商品是否能买
if i in idlist:
obj = Product.objects.filter(id=i)
# print('- '*50)
# print(obj[0].id)#对象列表嵌套
context.append(obj[0])
#此商品已下架
else:
obj = {'id':i,'name':'该商品已下架','price':''}
context.append(obj)
#没有创建购物车
elif cartlist == []:
context = '[]' return render(request,'supermarket/cartList.html',locals()) #购物车删除操作
class CartDel(View): def post(self,request):
id = request.POST.get('id')
id = int(id)
# cartlist = request.session.get('cartlist',0)
#获取session的用户名的购物车
username = request.session.get('username')
cartlist = request.session[username] #remove()会删除第一个等于指定值的元素
if cartlist != []:
cartlist.remove(id)
request.session[username] = cartlist return HttpResponse('删除成功') '''
from django.http import JsonResponse
用来对象dumps成json字符串,然后返回将json字符串封装成Response对象返回给浏览器。
并且他的Content-Type是application/json。
非字典只有list,tuple转json应该在使用HttpResponse的时候,传入一个safe=False参数
'''
def Json(request):
ddd = {"username":"知乎大神","age":18}
lll = ['a','b','c','d']
ttt = (1,2,3,4,5,6)
return JsonResponse(lll,safe=False)
#导入方法视图模板
from django.shortcuts import render
#导包
from django.http import HttpResponse,HttpResponseRedirect,JsonResponse
#导入类视图
from django.views import View
#从配置文件已安装的django应用模块导入数据库类
from mysite.models import User
from supermarket.models import Product
#导入json
import json
#导入时间模块
import time
#导入源生sql连接
from django.db import connection
#导入通用类视图装饰器
from django.utils.decorators import method_decorator
#定义一个用cookie验证登录的装饰器decorator
#用session验证登录的装饰器只需换下变量名,在注销功能改下即可
def cookie(func):
def wrapper(request,*args,**kwargs):
login = request.COOKIES.get("username",False)
if not login:
return HttpResponseRedirect('/supermarket/login')
return func(request,*args,**kwargs)
return wrapper
#定义反爬装饰器,定义形参,一秒允许请求一次
def limit(seconds=1):
#定义内部方法
def rate_limit(func):
def func_limit(request):
#获取当前时间
now = time.time()
ip = request.META.get('REMOTE_ADDR')
print(int(now))
print(ip)
print('- '*50)
#获取首次来访时间
request_time = request.session.get('req_time',0)
print(request_time)
_ip = request.session.get('ip',ip)
print(_ip)
#做减法
in_time = int(now) - request_time
#判断访问者在一秒内来了不止一次
if in_time < seconds and ip == _ip:
#抛出异常,使用第二个参数来指定异常
return HttpResponse('你是爬虫,不要来了',status = 403)
else:
#存储第一次请求时间
request.session['req_time'] = time.time()
request.session['ip'] = ip
#让访问者继续访问
ret = func(request)
return ret
return func_limit
return rate_limit
# Create your views here.
#定义注册逻辑类视图
class Reg(View):
#定义注册接收方法
def post(self,request):
#等待时间
time.sleep(1)
#接收参数
username = request.POST.get('username','未收到username值')
password = request.POST.get('password','未收到password值')
 
#注册入库逻辑
#先验证用户唯一性
res = User.objects.filter(username=username).count()
if res > 0:
# #该用户名已被注册
# #将dict强转为json数据
# data = json.dumps({'msg':'该用户名已被注册'},ensure_ascii=False)
# #声明返回网页头部信息为json类型
# return HttpResponse(data,content_type='application/json')
return JsonResponse({'msg':'该用户名已被注册'})
else:
#入库
#实例化一个对象
user = User(username=username,password=password)
#保存
user.save()
# #将dict强转为json数据
# data = json.dumps({'msg':'恭喜您,注册成功'},ensure_ascii=False)
# return HttpResponse(data,content_type='application/json')
return JsonResponse({'msg':'恭喜您,注册成功'},safe=False)
#为登录页面加上图形验证码的验证逻辑
from PIL import ImageDraw
#导入绘图字体库
from PIL import ImageFont
#到导入图片库
from PIL import Image
import io,random
#定义随机颜色方法
def get_random_color():
R = random.randrange(255)
G = random.randrange(255)
B = random.randrange(255)
return (R,G,B)
#定义随机验证码
def test_captcha(request):
#定义背景颜色
bg_color = get_random_color()
#定义画布大小,宽 高
img_size = (150,80)
#定义画笔,颜色中类,画布,背景颜色
image = Image.new('RGB',img_size,bg_color)
#定义画笔对象 ,图片对象,颜色类型
draw = ImageDraw.Draw(image,"RGB")
#定义随机字符
source = '0123456789qwertyuiopasdfghjklzxcvbnm'
#定义四个字符
#定义容器,用来接收随机字符串
code_str=""
for i in range(4):
#获取随机颜色
text_color = get_random_color()
#获取随机字符串
tmp_num = random.randrange(len(source))
#获取字符集
random_str =source[tmp_num]
#将随机生成的字符串添加到容器中
code_str += random_str
#将字符画动画布上 坐标,字符串,字符串颜色,字体
#先导入系统字体
my_font = ImageFont.truetype("c:\\Windows/Fonts/consolai.ttf",30)
draw.text((10+30*i,20),random_str,text_color,font=my_font)
#使用io获取一个缓存区
buf= io.BytesIO()
#将图片保存到缓存区 透明图片
image.save(buf,'png')
#将随机码存储到session中,用于登录认证
request.session['code'] = code_str
#第二个参数声明头部信息
return HttpResponse(buf.getvalue(),'image/png')
#定义登录逻辑类视图
class Login(View):
#定义登录方法
def post(self,request):
# time.sleep(2)
#接收参数
username = request.POST.get('username','未收到username值')
password = request.POST.get('password','未收到password值')
code = request.POST.get('code','未收到code值')
#判断
res = User.objects.filter(username=username,password=password).count()
 
#测试中文用户名
# return HttpResponse(res)
 
if res > 0 and code == request.session['code']:
#登录成功
response = HttpResponse('登陆成功')
#对中文用户名编码
username = bytes(username,'utf-8').decode('ISO-8859-1')
#存入cookie request.COOKIES.get('username')
response.set_cookie('username',username,max_age=3600)
response.set_cookie('password',password,max_age=3600)
#用户名存入session
request.session['username'] = username
return response
elif res > 0 and code != request.session['code']:
return HttpResponse('验证码输入有误,请重新输入!')
else:
#登录失败,防止暴力破解
return HttpResponse('您输入的用户名或者密码错误,请重新输入!')
#定义注销功能
class Logout(View):
#定义注销方法
def get(self,request):
#建立response对象
response = HttpResponseRedirect('/supermarket/login')
#删除cookie
response.delete_cookie('username')
response.delete_cookie('password')
# #删除session
# del request.session['username']
return response
 
# 定义商品列表页混合视图
class ProductList(View):
@method_decorator(cookie)
#客户端get请求
def get(self,request):
infos = Product.objects.all()
print(infos)
username = request.COOKIES.get('username','未登录')
#对中文用户名解码
try:
username = username.encode('ISO-8859-1').decode('utf-8')
except Exception as e:
print(e)
pass
#渲染模板
return render(request,'supermarket/productList.html',locals())
#商品入库
class Add(View):
def post(self,request):
name = request.POST.get('name')
price = request.POST.get('price')
#只让不同的商品入库
ret = Product.objects.filter(name=name,price=int(price)).count()
if ret == 0:
sql = Product(name=name,price=int(price))
sql.save()
return HttpResponse('入库成功')
else:
return HttpResponse('该商品已存在')
#定义商品删除操作
class ProDel(View):
 
def post(self,request):
#接受参数
id = request.POST.get('id')
id=int(id)
#删除操作
Product.objects.filter(id=id).delete()
return HttpResponse('删除成功')
#修改操作
class ProEdit(View):
def post(self,request):
id = request.POST.get('id')
id=int(id)
name = request.POST.get('name')
price = request.POST.get('price')
price=int(price)
#修改
Product.objects.filter(id=id).update(name=name,price=price)
return HttpResponse('修改成功')
#添加购物车操作
class AddCart(View):
def post(self,request):
id = request.POST.get('id')
id = int(id)
#判断购物车,是否存在
# cartlist = request.session.get('cartlist',0)
#获取session的用户名的购物车
username = request.session.get('username')
cartlist = request.session.get(username,0)
 
#如果没有购物车,就创建后添加
if cartlist == 0:
clist = []
clist.append(id)
# request.session['cartlist'] = clist
request.session[username] = clist
#如果有购物车
else:
#取出购物车
# slist = request.session['cartlist']
slist = request.session[username]
#id直接存入购物车
slist.append(id)
#把购物车重新放入session
# request.session['cartlist'] = slist
request.session[username] = slist
 
return HttpResponse('成功加入购物车')
#购物车列表页
class CartList(View):
def get(self,request):
# del request.session['cartlist']
# cartlist = request.session.get('cartlist',0)
#获取个人购物车
username = request.session.get('username',0)
cartlist = request.session.get(username,0)
#查询商品数据库的id字段
idlist = Product.objects.raw("select id from product")
#对象列表嵌套数据,用列表推导式和对象.属性,生成id列表
idlist = [ x.id for x in idlist]
# print(idlist)
#购物车为空或没有创建购物车
if cartlist != 0 and cartlist != []:
#准备传给前端的数据
context = []
for i in cartlist:
#判断购物车的商品是否能买
if i in idlist:
obj = Product.objects.filter(id=i)
# print('- '*50)
# print(obj[0].id)#对象列表嵌套
context.append(obj[0])
#此商品已下架
else:
obj = {'id':i,'name':'该商品已下架','price':''}
context.append(obj)
#没有创建购物车
elif cartlist == []:
context = '[]'
return render(request,'supermarket/cartList.html',locals())
#购物车删除操作
class CartDel(View):
def post(self,request):
id = request.POST.get('id')
id = int(id)
# cartlist = request.session.get('cartlist',0)
#获取session的用户名的购物车
username = request.session.get('username')
cartlist = request.session[username]
#remove()会删除第一个等于指定值的元素
if cartlist != []:
cartlist.remove(id)
request.session[username] = cartlist
return HttpResponse('删除成功')
'''
from django.http import JsonResponse
用来对象dumps成json字符串,然后返回将json字符串封装成Response对象返回给浏览器。
并且他的Content-Type是application/json。
非字典只有list,tuple转json应该在使用HttpResponse的时候,传入一个safe=False参数
'''
def Json(request):
ddd = {"username":"知乎大神","age":18}
lll = ['a','b','c','d']
ttt = (1,2,3,4,5,6)
return JsonResponse(lll,safe=False)

Django子应用里的通用类混合视图处理的更多相关文章

  1. django 中基于类的视图

    django 视图 分为两种: 1.  FBV  基于函数的视图      function   based  view 2.  CBV  基于类的视图         class   based  ...

  2. Django内置的通用类视图

    1.ListView 表示对象列表的一个页面. 执行这个视图的时候,self.object_list将包含视图正在操作的对象列表(通常是一个查询集,但不是必须). 属性: model: 指定模型 te ...

  3. Django REST FrameWork中文教程3:基于类的视图

    我们也可以使用基于类的视图编写我们的API视图,而不是基于函数的视图.我们将看到这是一个强大的模式,允许我们重用常用功能,并帮助我们保持代码DRY. 使用基于类的视图重写我们的API 我们将首先将根视 ...

  4. Django 官方推荐的姿势:类视图

    作者:HelloGitHub-追梦人物 文中所涉及的示例代码,已同步更新到 HelloGitHub-Team 仓库 在开发网站的过程中,有一些视图函数虽然处理的对象不同,但是其大致的代码逻辑是一样的. ...

  5. Django笔记&教程 7-1 基于类的视图(Class-based views)介绍

    Django 自学笔记兼学习教程第7章第1节--基于类的视图(Class-based views)介绍 点击查看教程总目录 1 介绍 Class-based views (CBVs) are view ...

  6. mongdo通用类(C#版)

    日前从公司离职,很快,还没休息就步入了现在的公司,开始跟着公司的脚步走. 公司的项目基本都是大数据的,所以在数据库上大部分都是使用Mongodb和Redis,基本都是Nosql型的数据库为主.以前自己 ...

  7. Django编写RESTful API(三):基于类的视图

    欢迎访问我的个人网站:www.comingnext.cn 前言 在上一篇文章中,主要讲的是请求和响应,项目里面views.py中的视图函数都是基于函数的,并且我们介绍了@api_view这个很有用的装 ...

  8. Python的Django框架中forms表单类的使用方法详解

    用户表单是Web端的一项基本功能,大而全的Django框架中自然带有现成的基础form对象,本文就Python的Django框架中forms表单类的使用方法详解. Form表单的功能 自动生成HTML ...

  9. Django——基于类的视图源码分析 一

    基于类的视图(Class-based view)是Django 1.3引入的新的视图编写方式,用于取代以前基于函数(Function-based)方式. 借助于OO和Python中方便的多重继承特性, ...

随机推荐

  1. MYSQL的group by笔记

    对应的表数据如下 现在的需求是要找出dcid为9951,9957,9064共同拥有的good_code. 第一种方案是 SELECT a.good_code FROM ( SELECT good_co ...

  2. Linux 进程终止后自动重启

    /opt/a.sh #! /bin/bash ps -ef | grep python3 a.py | grep -v grep | grep python3 if [ $? -ne 0 ] then ...

  3. Java读取excel表,getPhysicalNumberOfCells()和getLastCellNum区别

    excel表存入数据库,发现有时报数组下标越界异常.调试发现用了 getPhysicalNumberOfCells(),这个是用来获取不为空的的列个数. getLastCellNum是获取最后一个不为 ...

  4. .NET Core微服务之基于Exceptionless实现分布式日志记录

    Tip: 此篇已加入.NET Core微服务基础系列文章索引 一.Exceptionless极简介绍 Exceptionless 是一个开源的实时的日志收集框架,它可以应用在基于 ASP.NET,AS ...

  5. ColorUtil【Color工具类(color整型、rgb数组、16进制互相转换)】

    版权声明:本文为HaiyuKing原创文章,转载请注明出处! 前言 主要用于color整型.rgb数组.16进制互相转换(-12590395 <--> #3FE2C5 <--> ...

  6. java~gradle构建公用包并上传到仓库

    java~gradle构建公用包并上传到仓库 我们一般会把公用的代码放在一个包里,然后其它 项目可以直接使用,就像你使用第三方包一样! 仓库 存储包的地方叫做仓库,一般可以分为本地仓库和远程仓库,本地 ...

  7. 【链表问题】打卡9:将单链表的每K个节点之间逆序

    前言 以专题的形式更新刷题贴,欢迎跟我一起学习刷题,相信我,你的坚持,绝对会有意想不到的收获.每道题会提供简单的解答,如果你有更优雅的做法,欢迎提供指点,谢谢. 注:如果代码排版出现了问题麻烦通知我下 ...

  8. SQL优化 MySQL版 - 单表优化及细节详讲

    单表优化及细节详讲 作者 : Stanley 罗昊 [转载请注明出处和署名,谢谢!] 注:本文章需要MySQL数据库优化基础或观看前几篇文章,传送门: B树索引详讲(初识SQL优化,认识索引):htt ...

  9. 推荐一款好用的任务定时器:Quartz

    前言 官网:https://www.quartz-scheduler.net/ 一款开源的任务定时器. 日常有很多地方需要定时刷新的,比如微信开发中的微信API token,或者定时清理一下缓存数据等 ...

  10. Revit通过API创建共享参数

    Revit共享参数是通过创建一个.txt类型的文件来保存相关信息,一旦与项目保存完毕之后,共享参数也就变成了项目参数(项目参数无法通过API创建),项目参数是保存在Revit项目里面的,所以此时这个. ...