一、FBV视图

视图函数处理HTTTP请求,在视图里定义函数为FBV。

设置响应方式

HTTP协议分为HTTP请求和HTTP响应。

HTTP响应方式称为HTTP状态码,分5种状态:消息、成功、重定向、请求错误、服务器错误

按使用频率划分:成功、重定向、异常响应(请求错误和服务器错误)

返回响应内容

通过return方式返回响应内容,然后生成网页内容在浏览器上。

  • python响应方式——return
  • Django响应方式——HttprRsponse、JsonResponse、redirect、render等
HttpResponse(”你好“,status=200)====status 200,以下所有响应的基类
HttpResponseRedirect(”/“)====状态码 302,重定向
HttpResponsePermanentRedirect(”/“)====状态码 301,永久重定向
HttpResponseBadRequest("400") ====状态码400 访问的页面不存在或者请求错误
HttpResponseNotFound("404") ====状态码404 网页不存在或者url失效
HttpResponseForbidden('403') ====没有访问权限
HttpResponseNotAllowed("405")====不允许使用该请求方式
HttpResponseServerError(”500“)====服务器内部错误
JsonResponse({"name":"joe"})====输出json,状态码200
StreamingHttpResponse()====状态码200,响应内容以流形式输出
index/urls.pyfrom django.urls import path
from . import views
urlpatterns = [# 定义首页的路由path('', views.index, name='index'),
]index/views.pyfrom django.http import HttpResponse
from django.shortcuts import render
def index(request):html = '<h1>Hello World</h1>'return HttpResponse(html, status=200)

return HttpResponse(html, status=200)

第一个参数:响应内容,网页内容(HTML)或JSON数据(生成API接口数据)

如果要生成网页内容,就需要将 HTML 语言以 字符串的形式表示,如果网页内容过大,就会增加视图函数的代码量,Django进行了封装处理,定义了函数 render 和 redirect。

render(request, template_name, context=None, content_type=None, status=None, using=None)

  • request:浏览器向服务器发送的请求对象,包含用户信息、请求内容和请求方式等。
  • template_name:设重模板文件名,用于生成网页内容。
  • context:对模板上下文(模板变量)赋值,以字典格式表示,默认情况下是一个空字典。
  • content_type:响应内容的数据格式,一般情况下使用默认值即可。
  • status:HTTP状态码,默认为200。
  • using:设置模板引擎,用于解析模板文件,生成网页内容。

视图函数 index 定义的变量 value 作为 render 的参数 context,而模板 index.html 里通过使用模板上下文(模板变量){{ title }} 来获取变量 value 的数据,上下文的命名必须与变量 value 的数据命名(字典的key)相同,这样 Django 内置的模板引擎才能将参数context(变量value)的数据与模板上下文进行配对,从而将参数 context 的数据转换成网页内容。

第二个参数:HTTP状态码

from django.http import HttpResponse
from django.shortcuts import render# def index(request):
#     html = '<h1>Hello World</h1>'
#     return HttpResponse(html, status=200)# def index(request):
#     value = {'title': 'Hello MyDjango'}
#     return render(request, 'index.html', context=value)def index(request):title = {'key': 'Hello MyDjango'}content = {'key': 'This is MyDjango'}return render(request, 'index.html', locals())

设置重定向

重定向状态码:

301(永久性跳转,抓新内容将旧网址替换为新网址)HttpResponseRedirect

302(临时跳转,抓新内容保留旧网址)HttpResponsePermanentRedirect

两个都继承HttpResponseRedirectBase类,该类继承于HttpResponse。

from django.urls import path
from . import viewsurlpatterns = [# 定义首页的路由path('', views.index, name='index'),# 定义商城的路由path('shop', views.shop, name='shop')
]
from django.http import HttpResponseRedirect
from django.http import HttpResponsePermanentRedirect
from django.shortcuts import reverse
from django.shortcuts import render, redirectdef index(request):return redirect('index:shop' ,permanent=True)# 设置302的重定向# url = reverse('index:shop')# return HttpResponseRedirect(url)# 设置301的重定向# return HttpResponsePermanentRedirect(url)def shop(request):return render(request, 'index.html')

异常响应

异常响应HTTP状态码:404,500

与200响应过程一样,用render作为响应过程,并设置status的状态码

异常响应返回页面一样,配置全局异常响应,MyDjango的urls.py文件里配置,index文件views.py定义视图函数,

from django.urls import path, include
urlpatterns = [# 指向index的路由文件urls.pypath('', include(('index.urls', 'index'), namespace='index')),
]
# 全局404页面配置
handler404 = 'index.views.pag_not_found'
# 全局500页面配置
handler500 = 'index.views.page_error'
from django.shortcuts import render
from django.http import Http404def pag_not_found(request):"""全局404的配置函数 """return render(request, '404.html', status=404)def page_error(request):"""全局500的配置函数 """return render(request, '500.html', status=500)
<!DOCTYPE html>
<html>
<body>
<h3>这是404页面</h3>
</body>
</html><!DOCTYPE html>
<html>
<body>
<h3>这是500页面</h3>
</body>
</html>
settings.py
DEBUG = False    #关闭调试模式。若为True,调试模式,异常时,页面提供代码代码信息
ALLOWED_HOSTS = ['*']    #设置所有域名可以访问
index/views.py
from django.shortcuts import render
from django.http import Http404def index(request):if request.GET.get('error', ''):raise Http404("page does not exist")else:return render(request, 'index.html')

文件下载功能

三种方式:

HttpResponse所有响应过程核心类,底层功能类是HttpResponseBase

StreamingHttpResponse是在HttpResponseBase基础上继承和重写,适用于大规模数据响应和文件传输响应。文件下载以字节方式读取。实例化时传入文件的字节流,需设置响应内容的数据格式和文件下载格式。

  1. 参数as_attachment若为False不提供下载功能,文件在浏览器打开读取,若不能打开则下载到本地,但没有设置文件后缀名。若为True,则开启文件下载功能,将文件下载到本地,并设置文件后缀名。
  2. filename设置下载文件的文件名,该参数与as_attachment的设置有关,若as_attachment为False,则filename不起作用。as_attachment为True,若filename为空,则用该文件原有的文件名作为下载文件的文件名,反之以参数filename作为下载文件的文件名。filename和as_attachment的关联可在FileResponse的函数set_headers里找到。
  3. 形参*args和**kwargs用于设置HttpResponseBase的参数,即响应内容的数据格式content_type和响应状态码status等参数。

FileResponse是在StreamingHttpResponse基础上继承和重写,适用于文件传输响应。

index/urls.py
from django.urls import path
from . import viewsurlpatterns = [# 定义首页的路由path('', views.index, name='index'),path('download/file1', views.download1, name='download1'),path('download/file2', views.download2, name='download2'),path('download/file3', views.download3, name='download3'),
]
MyDjango/urls.py
from django.urls import path, include
urlpatterns = [# 指向index的路由文件urls.pypath('', include(('index.urls', 'index'), namespace='index')),
]
index/views.pyfrom django.shortcuts import render
from django.http import HttpResponse, Http404
from django.http import StreamingHttpResponse
from django.http import FileResponsedef index(request):return render(request, 'index.html')def download1(request):file_path = 'D:\cat.jpg'try:r = HttpResponse(open(file_path, 'rb'))r['content_type'] = 'application/octet-stream'r['Content-Disposition'] = 'attachment; filename=cat.jpg'return rexcept Exception:raise Http404('Download error')def download2(request):file_path = 'D:\duck.jpg'try:r = StreamingHttpResponse(open(file_path, 'rb'))r['content_type'] = 'application/octet-stream'r['Content-Disposition'] = 'attachment; filename=duck.jpg'return rexcept Exception:raise Http404('Download error')def download3(request):file_path = 'D:\dog.jpg'try:f = open(file_path, 'rb')r = FileResponse(f, as_attachment=True, filename='dog.jpg')return rexcept Exception:raise Http404('Download error')
<!DOCTYPE html>
<html>
<body>
<a href="{% url 'index:download1' %}">HttpResponse-下载</a>
<br>
<a href="{% url 'index:download2' %}">StreamingHttpResponse-下载</a>
<br>
<a href="{% url 'index:download3' %}">FileResponse-下载</a>
</body>
</html>
  1. HttpResponse: 原理是将文件读取并载入内存,然后输出到浏览器上实现下载功能。如果下载的文件较大,该方法就会占用很多内存。对于下载大文件,Django推荐使用后两者,这两种将下载文件分批写入服务器的本地磁盘,而不再将文件载入服务器的内存。
  2. StreamHttpResponse和FileResponse 的实现原理是相同的,两者都是将下载文件分批写入本地磁盘,实现文件的流式响应输出。
  3. 从适用范围来说,StreamingHttpResponse的适用范围更为广泛,可支持大规模数据或文件输出,而FileResponse只支持文件输出。
  4. 从使用方式来说,由于StreamingHttpResponse支持数据或者文件输出,因此在使用时需要设置响应输出类型和方式,而FileResponse只需要设置3个参数即可实现文件下载功能。

HTTP请求对象

获取请求信息

当在浏览器上访问某个网址是,其实质是向网站发送一个HTTP请求

OPTIONS: 返回服务器针对特定资源所支持的请求方法

GET: 向特定资源发出请求(访问网页)

POST: 向指定资源提交数据处理请求(提交表单、上传文件)

PUT:向指定资源位置上传数据内容。

DELETE:请求服务器删除request-URL所标示的资源。

HEAD: 与GET请求类似,返回的响应中没有具体内容,用于获取报头

TRACE:回复和显示服务器收到的请求,用于测试和诊断。

CONNECT: HTTP/1.1协议中能够将连接改为管道方式的代理服务器。

GET请求的请求参数是在路由地址后添加“?”和参数内容,以key=value形式表示,如果涉及多个参数,每个参数间以&隔开,如127.0.0.1:8001/?user=xy&pw=123

POST请求的参数一般以表单形式传递,常见的表单使用HTML的form标签,并且form标签的method属性设置为POST。

Django接受到HTTP请求后,创建WSGIRequest对象,作为视图函数的首个参数,常写成request。WSGIRequest继承并重写HttpRequest, 若要获取请求信息,只需读取相关的类属性。

MyDjango/urls.pyfrom django.urls import path, include
urlpatterns = [# 指向index的路由文件urls.pypath('', include(('index.urls', 'index'), namespace='index')),
]
index/urls.py
from django.urls import path
from . import viewsurlpatterns = [# 定义首页的路由path('', views.index, name='index'),
]
index/views.py
from django.shortcuts import renderdef index(request):# 使用method属性判断请求方式if request.method == 'GET':# 类方法的使用print(request.is_secure())print(request.is_ajax())print(request.get_host())print(request.get_full_path())print(request.get_raw_uri())# 属性的使用print(request.COOKIES)print(request.content_type)print(request.content_params)print(request.scheme)# 获取GET请求的请求参数print(request.GET.get('user', ''))return render(request, 'index.html')elif request.method == 'POST':# 获取POST请求的请求参数print(request.POST.get('user', ''))return render(request, 'index.html')
<!DOCTYPE html>
<html>
<body>
<h3>Hello world</h3>
<form action="" method="POST">{% csrf_token %}<input type="text" name="user"/><input type="submit" value="提交"/>
</form>
</body>
</html>

文件上传功能

index/urls.py
from django.urls import path
from . import viewsurlpatterns = [# 定义路由path('', views.upload, name='uploaded'),
]
MyDjango/urls.py
from django.urls import path, include
urlpatterns = [# 指向index的路由文件urls.pypath('', include(('index.urls', 'index'), namespace='index')),
]
index/views.py
from django.shortcuts import render
from django.http import HttpResponse
import osdef upload(request):# 请求方法为POST时,执行文件上存if request.method == "POST":# 获取上传的文件,如果没有文件,则默认为NonemyFile = request.FILES.get("myfile", None)if not myFile:return HttpResponse("no files for upload!")# 打开特定的文件进行二进制的写操作f = open(os.path.join("D:\\upload", myFile.name), 'wb+')# 分块写入文件for chunk in myFile.chunks():f.write(chunk)f.close()return HttpResponse("upload over!")else:# 请求方法为GET时,生成文件上存页面return render(request, 'upload.html')
<!DOCTYPE html>
<html>
<body>
<form enctype="multipart/form-data" action="" method="post">{% csrf_token %}<input type="file" name="myfile" /><br><input type="submit" value="上存文件"/>
</form>
</body>
</html>
MyDjango/handler.py
from django.core.files.uploadhandler import *
from django.core.files.uploadedfile import *
class myFileUploadHandler(TemporaryFileUploadHandler):def new_file(self, *args, **kwargs):super().new_file(*args, **kwargs)print('This is my FileUploadHandler')self.file = TemporaryUploadedFile(self.file_name, self.content_type, 0, self.charset, self.content_type_extra)
settings.pySTATIC_URL = '/static/'
# 配置文件数据的临时存放文件夹
FILE_UPLOAD_TEMP_DIR = 'D:\\temp'
# 判断文件大小的条件
FILE_UPLOAD_MAX_MEMORY_SIZE = 209715200
# 设置文件上存的处理过程
FILE_UPLOAD_HANDLERS = ['MyDjango.handler.myFileUploadHandler']
# # 默认配置
# FILE_UPLOAD_HANDLERS = (
#     "django.core.files.uploadhandler.MemoryFileUploadHandler",
#     "django.core.files.uploadhandler.TemporaryFileUploadHandler",)

cookie实现反爬虫

index/urls.py
from django.urls import path
from . import viewsurlpatterns = [# 定义路由path('', views.index, name='index'),path('create', views.create, name='create'),path('myCookie', views.myCookie, name='myCookie'),
]views.py
from django.http import Http404, HttpResponse
from django.shortcuts import render, redirect
from django.shortcuts import reversedef index(request):return render(request, 'index.html')def create(request):r = redirect(reverse('index:index'))# 添加Cookie# response.set_cookie('uid', 'Cookie_Value')r.set_signed_cookie('uuid', 'id', salt='MyDj', max_age=10)return rdef myCookie(request):cookieExist = request.COOKIES.get('uuid', '')if cookieExist:# 验证加密后的Cookies是否有效try:request.get_signed_cookie('uuid', salt='MyDj')except:raise Http404('当前Cookie无效哦!')return HttpResponse('当前Cookie为:' + cookieExist)else:raise Http404('当前访问没有Cookie哦!')MyDjango/mySigner.py
from django.core.signing import TimestampSigner
class myTimestampSigner(TimestampSigner):def sign(self, value):print(value)return value + 'Test'def unsign(self, value, max_age=None):print(value)return value[0:-4]
<!DOCTYPE html>
<html>
<body>
<h3>Hello Cookies</h3>
<a href="{% url 'index:create' %}">创建Cookie</a>
<br>
<a href="{% url 'index:myCookie' %}">查看Cookie</a>
</body>
</html>

请求头实现反爬虫

index/urls.pyfrom django.urls import path
from . import viewsurlpatterns = [# 定义路由path('', views.index, name='index'),path('getHeader', views.getHeader, name='getHeader')
]views.pyfrom django.http import JsonResponse
from django.shortcuts import renderdef index(request):return render(request, 'index.html')# API接口判断请求头
def getHeader(request):header = request.META.get('HTTP_SIGN', '')if header:value = {'header': header}else:value = {'header': 'null'}return JsonResponse(value)
<!DOCTYPE html>
<html>
{% load static %}
<script src="{% static 'jquery.js' %}"></script>
<script>
$(function(){$("#bt01").click(function(){var value = $.ajax({type: "GET",url:"/getHeader",dataType:'json',async: false,headers: {"sign":"123",}}).responseJSON;value = '<h2>'+value["header"]+'</h2>';$("#myDiv").html(value);});
});
</script>
<body>
<h3>Hello Headers</h3>
<div id="myDiv"><h2>AJAX获取请求头</h2></div>
<button id="bt01" type="button">改变内容</button>
</body>
</html>

二、CBV视图

数据显示视图

数据操作视图

日期筛选视图

待。。。。。

本文总结自《Django3 web 应用开发实战-黄永祥》

Django3(三)FBV视图和CBV视图相关推荐

  1. FBV(function base views) 顾名思义基于函数的视图类 CBV(class base views)基于类的视图类

    一. 概念 FBV(function base views) 顾名思义基于函数的视图类 CBV(class base views)基于类的视图类 至于区别呢? 我觉得只是写法上的不一样, 实现的结果都 ...

  2. Django框架之CBV类视图及类视图装饰器

    前言 这几年一直在it行业里摸爬滚打,一路走来,不少总结了一些python行业里的高频面试,看到大部分初入行的新鲜血液,还在为各样的面试题答案或收录有各种困难问题 于是乎,我自己开发了一款面试宝典,希 ...

  3. Django CBV视图

    注明 本笔记主要参考<Django应用开发实战><Django企业开发实战>,这两本书前者详细,后者精炼.学习之后真的是感觉自己进步了很多.值得一读 文章目录 注明 前言 一. ...

  4. Spring Boot系列(三)、Spring Boot视图技术(Jsp、FreeMarker、Thymeleaf)

    三.Spring Boot视图技术 3.1 Spring Boot常见的有三种视图整合 3.2 第一种视图整合jsp 1 pom.xml文件: 2 然后新建JSP视图的访问和存储目录webapp/WE ...

  5. 四十七、python学习之Django框架(DRF框架三):Request与Response、视图与视图集、路由

    Django REST framwork 提供的视图的主要作用: 控制序列化器的执行(检验.保存.转换数据); 控制数据库查询的执行 一.Request与Response: 1. Request:   ...

  6. Django中的CBV视图

    Web 开发是一项无聊而且单调的工作,特别是在视图功能编写方面更为显著.为了减少这种痛苦,Django植入了视图类这一功能,该功能封装了视图开发常用的代码,无须编写大量代码即可快速完成数据视图的开发, ...

  7. RESTful之视图概览和视图说明

    一.视图概览 REST framework 提供了众多的通用视图基类与扩展类,以简化视图的编写. 视图的继承关系: 视图的方法与属性: 二.视图说明 1. 两个基类 1)APIView rest_fr ...

  8. couchdb 视图操作_couchDB视图

    视图函数 map函数 Map方法的参数只有一个,就是当前的文档对象.Map方法的实现需要根据文档对象的内容,确定是否要输出结果. 如果需要输出的话,可以通过emit来完成. emit方法有两个参数,分 ...

  9. 【Android 逆向】IDA 工具使用 ( 十六进制视图 Hex View-1 | 结构体视图 Structures | 枚举视图 Enums | 导入视图 Import | 导出视图 )

    文章目录 一.十六进制视图 Hex View-1 二.结构体视图 Structures 三.枚举视图 Enums 四.导入视图 Import 五.导出视图 Export 一.十六进制视图 Hex Vi ...

最新文章

  1. 从头开始写框架(一):浅谈JS模块化发展
  2. 【TP3.2】模板 select选项采坑
  3. HTML5 未来不可阻挡的力量
  4. python中语法错误-python中的语法错误是指什么
  5. 什么是is research?
  6. Android CTS 测试总结【转】
  7. 做好数据挖掘模型的9条经验总结
  8. Codeforces936C. Lock Puzzle
  9. jvm 解释器和编译器
  10. Linux虚拟机连不上网克隆虚拟机网卡无法启动
  11. java面向对象--对象初始化
  12. Linux 下安装Node.js
  13. MVC3+EF4.1学习系列(八)-----利用Repository and Unit of Wor
  14. iOS数据库的使用(二):sqlite教程
  15. 请问smartadmin中如何只用其treeview 组件?
  16. IPhone手机打开EPUB文件教程
  17. 幼儿园早期阅读活动的现状及问题研究
  18. Android视图绘制流程完全解析(二)
  19. 设置代理让github加速
  20. Mean Average Precision(MAP):平均精度均值

热门文章

  1. Rol Pooling的作用
  2. 人工智能导论(6)——机器学习(Machine Learning)
  3. jsp文字上下居中显示_表单元素input、按钮、文字完美垂直居中对齐方法
  4. 安装ButterKnife(黄油刀)9.0
  5. 张益唐直播报告学术报告,零点猜想问题终于被解决(文末可获取论文原文)
  6. 三维坐标旋转矩阵推导过程(包看懂)
  7. 惠普:云计算不适合SAP这样的应用程序
  8. SpringBoot打包docker镜像并桥接mysql(windows版)
  9. sudo insmod pin4driver.ko
  10. 我的三年软件测试之路----金阳光老师自传