# 子应用的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. java SE Development kit 8 Update 201 (64-bit) 的安装相关

    登录http://www.oracle.com,下载JDK(J2SE) JDK 1.0,1.1,1.2,1.3,1.4 1.5 (JDK5.0) à支持注解.支持泛型   1.6(JDK6.0) à ...

  2. ArticleRemoveDelDialog【基于AlertDialog的回收删除对话框】

    版权声明:本文为HaiyuKing原创文章,转载请注明出处! 前言 回收删除对话框,继承AlertDialog. 仿照钉钉的长按弹出的移除置顶对话框. 效果图 代码分析 继承AlertDialog: ...

  3. Hibernate框架_搭建第一个Hibernate框架

    一.eclipse搭建 A.创建动态web项目 New-->Dynamic web project(web project) B.导入jar包 1.数据库驱动包 2.hibernate开发必须j ...

  4. Java开发相关的linux一些基础命令,必须要掌握的

      1.查找文件 find / -name filename.txt 根据名称查找/目录下的filename.txt文件. find . -name "*.xml" 递归查找所有的 ...

  5. 在虚拟机中搭建qduoj(一)——准备工作

    为缩减篇幅,已略去ubuntu镜像下载.虚拟机(VirtualBox.VMware)安装等操作,若有疑问请搜索相关教程. 1.虚拟机系统安装 本教程使用Ubuntu16.04 server版本(des ...

  6. Chart.js 與 ASP.NET MVC 整合應用

    Chart.js 是一套開放原始碼的「圖表」繪製函式庫,和其他第三方的圖表工具相比,Chart.js 的特色如下: 支援 HTML 5.響應式網頁 (RWD, Responsive Web Desig ...

  7. Python 基于python操纵zookeeper介绍

    基于python操纵zookeeper介绍 by:授客  QQ:1033553122 测试环境 Win7 64位 Python 3.3.4 kazoo-2.6.1-py2.py3-none-any.w ...

  8. 如何快速清理 docker 资源

    如果经常使用 docker,你会发现 docker 占用的资源膨胀很快,其中最明显也最容易被察觉的应该是对磁盘空间的占用.本文将介绍如何快速的清理 docker 占用的系统资源,具体点说就是删除那些无 ...

  9. 啰嗦的 java,简洁的 lombok —— lombok 的使用及简单实现单例模式注解

    lombok 是什么? lombok 是一个非常神奇的 java 类库,会利用注解自动生成 java Bean 中烦人的 Getter.Setting,还能自动生成 logger.ToString.H ...

  10. Git源代码管理

    一. 分支管理 使用 git 进行源代码管理,一般将某个项目的所有分支分为以下几条主线 1. Master 顾名思义,既然名字叫 Master ,那么该分支就是主分支的意思. master 分支永远是 ...