Django框架03 /视图相关
Django框架03 /视图相关
1. 请求相关
HTTPRequest对象
- HTTPRequest对象就是咱们的视图函数的参数request
- 当一个页面被请求时,Django就会创建一个包含本次请求原信息(请求报文中的请求行、首部信息、内容主体等)的HttpRequest对象。
- Django会将这个对象自动传递给响应的视图函数,一般视图函数约定俗成地使用 request 参数承接这个对象。
请求相关的常用值
path_info
# 返回用户访问url,不包括域名 method
# 请求中使用的HTTP方法的字符串表示,全大写表示 GET
# 包含所有HTTP GET参数的类字典对象 POST
# 包含所有HTTP POST参数的类字典对象 body
b'name=python&price=123.00'
# 请求体,byte类型 request.POST的数据就是从body里面提取到的
属性
print(request) # <WSGIRequest: GET '/home/'>
print(dir(request)) print(request.path) # /home/ 纯路径
print(request.path_info) # /home/ 纯路径
print(request.get_full_path()) # /home/?a=1&b=2 全路径(不包含ip地址和端口) print(request.META) # 请求头相关数据,是一个字典 print(request.method) # GET print(request.GET) # <QueryDict: {}> QueryDict对象存储GET相关数据 print(request.POST)
print(request.body) # 能够拿到请求数据部分的数据(post有,get没有)
2.响应相关
HTTPResponse对象
# 返回字符串
HTTPResponse('字符串') # 返回页面
render(request,'xx.html') # 重定向
redirect 重定向
# 用法:redirect(路径)/ redirect(别名)
# 示例:redirect('/index/')
重定向/301/302
- 301和302的区别
- 相同点:
- 301和302状态码都表示重定向,就是说浏览器在拿到服务器返回的这个状态码后会自动跳转到一个新的URL地址,这个地址可以从响应的Location首部中获取(用户看到的效果就是他输入的地址A瞬间变成了另一个地址B)
- 不同点:
- 301表示旧地址A的资源已经被永久地移除了(这个资源不可访问了),搜索引擎在抓取新内容的同时也将旧的网址交换为重定向之后的网址
- 302表示旧地址A的资源还在(仍然可以访问),这个重定向只是临时地从旧地址A跳转到地址B,搜索引擎会抓取新的内容而保存旧的网址。
- 相同点:
- 重定向原因:
- 网站调整(如改变网页目录结构)
- 网页被移到一个新地址
- 网页扩展名改变(如应用需要把.php改成.Html或.shtml)
- 这种情况下,如果不做重定向,则用户收藏夹或搜索引擎数据库中旧地址只能让访问客户得到一个404页面错误信息,访问流量白白丧失;再者某些注册了多个域名的网站,也需要通过重定向让访问这些域名的用户自动跳转到主站点
- 临时重定向(响应状态码:302)和永久重定向(响应状态码:301)对普通用户来说是没什么区别的,它主要面向的是搜索引擎的机器人
- A页面临时重定向到B页面,那搜索引擎收录的就是A页面
- A页面永久重定向到B页面,那搜索引擎收录的就是B页面
- 301和302的区别
3.FBV和CBV 视图(视图函数和视图类)
3.1 类视图 CBV
views.py
from django.views import View
class LoginView(View): def dispatch(self, request, *args, **kwargs):
print('请求来啦!!!!')
ret = super().dispatch(request, *args, **kwargs)
print('请求处理的逻辑已经结束啦!!!')
return ret
def get(self,request):
print('get请求')
return render(request,'login.html') def post(self,request):
print(request.POST)
return HttpResponse('登录成功') # 处理get/post请求直接定义get/post方法,不需要自己判断请求方法了,源码中用dispatch方法中使用了反射来处理的
urls.py
路由写法url(r'^login/', views.LoginView.as_view()),
3.2 视图函数 FBV
views.py
def login(request,*args,**kwargs):
if request.method == 'GET':
return render(request,'login.html')
elif request.method == 'POST':
username = request.POST.get('username')
password = request.POST.get('password')
if username == 'zhangsan' and password == '123':
return render(request,'index.html')
urls.py
路由写法url(r'^login/', views.login),
3.3 视图加装饰器
代码示例:
# 装饰器
def wrapper(func):
def inner(*args, **kwargs):
print(11111)
ret = func(*args, **kwargs)
print(22222)
return ret
return inner # 视图函数
@wrapper
def index(request):
print('index')
return HttpResponse('indexxxxxxxxx') # 视图类
from django.utils.decorators import method_decorator
@method_decorator(wrapper,name='get') #方式3 class LoginView(View):
@method_decorator(wrapper) #方式2
def dispatch(self, request, *args, **kwargs)
print('请求来啦!!!!') ret = super().dispatch(request, *args, **kwargs) print('请求处理的逻辑已经结束啦!!!')
return ret
@method_decorator(wrapper) #方式1
def get(self,request):
print('get请求')
return render(request,'login.html') def post(self,request):
print(request.POST)
return HttpResponse('登录成功')
添加装饰器的三种方式
- 方式1:
添加在每一个函数中 - 方式2:
直接添加在dispatch里面,这样每个函数都会执行 - 方式3:
直接添加在类上,后面的name表示只给get添加装饰器
以这种方式如果想给多个方法加装饰器,需要写多层装饰器,因为name这个参数的值必须是个字符串,并且不能同时写两个方法
- 方式1:
注意:
- 添加装饰器前必须导入from django.utils.decorators import method_decorator
- 添加装饰器的格式必须为@method_decorator(),括号里面为装饰器的函数名
- 给类添加时必须声明name
Django框架03 /视图相关的更多相关文章
- Django框架04 /模板相关、别名/反向解析/路由分发
Django框架04 /模板相关.别名/反向解析/路由分发 目录 Django框架04 /模板相关.别名/反向解析/路由分发 1. 语法 2. 变量/万能的点 3 . 过滤器 4. 标签Tags 5. ...
- django框架-DRF视图中的request和response
1.Request 相对于django框架,DRF工程的request类则是继承自HttpRequest类,Rest framework提供了parser解释器,用来解释请求中的content_typ ...
- Django框架简介-视图系统
2.3 视图系统 一个视图函数(类),简称视图,是一个简单的Python 函数(类),它接受Web请求并且返回Web响应. 响应可以是一张网页的HTML内容,一个重定向,一个404错误,一个XML文档 ...
- Django框架1——视图和URL配置
三个命令 1.创建一个django项目 在cmd中:django-admin.py startproject project_name D:\python\django_site>django- ...
- django框架基础-视图系统-长期维护
################## 什么是视图? ####################### 视图: 1,一个视图函数(类),简称视图,是一个简单的Python 函数(类),它接受W ...
- Django 框架之视图函数(Views)
http请求中产生的两个核心对象: http请求: HttpRequest对象 http响应: HttpResponse对象 所在位置: django.http HttpRequest 对象的属性和方 ...
- [Django框架之视图层]
[Django框架之视图层] 视图层 Django视图层, 视图就是Django项目下的views.py文件,它的内部是一系列的函数或者是类,用来专门处理客户端访问请求后处理请求并且返回相应的数据,相 ...
- Django框架 之 view视图
Django框架 之 view视图 浏览目录 概述 简单的视图 HttpRequest对象 CBV和FBV 给视图加装饰器 Request对象 Response对象 JsonResponse对象 Dj ...
- Python的Django框架中的Cookie相关处理
Python的Django框架中的Cookie相关处理 浏览器的开发人员在非常早的时候就已经意识到. HTTP's 的无状态会对Web开发人员带来非常大的问题,于是(cookies)应运而生. coo ...
随机推荐
- Java_图片转字符
把高达头像转换成字符[-V-] 调节双循环里y与x的增量改变字符输出的细节.高和长 public class ImgToStr { public static void main(String arg ...
- OpenCV开发笔记(六十四):红胖子8分钟带你深入了解SURF特征点(图文并茂+浅显易懂+程序源码)
若该文为原创文章,未经允许不得转载原博主博客地址:https://blog.csdn.net/qq21497936原博主博客导航:https://blog.csdn.net/qq21497936/ar ...
- 黎活明8天快速掌握android视频教程--25_网络通信之资讯客户端
1 该项目的主要功能是:后台通过xml或者json格式返回后台的视频资讯,然后Android客户端界面显示出来 首先后台新建立一个java web后台 采用mvc的框架 所以的servlet都放在se ...
- JavaWeb网上图书商城完整项目--day02-16.登录功能各层实现
/*1.第一步将用户提交的参数封装成javabean对象 * *2.对提交的参数的进行合法性的校验 * *3.通过用户名和密码去查找得到user对象 *如果user对象为null,说明用户名和密码不正 ...
- 使用反应式关系数据库连接规范R2DBC操作MySQL数据库
1. 简介 三月份已经介绍过R2DBC,它是一种异步的.非阻塞的关系式数据库连接规范.尽管一些NoSQL数据库供应商为其数据库提供了反应式数据库客户端,但对于大多数项目而言,迁移到NoSQL并不是一个 ...
- JAVA设计模式 3【创建型】理解工厂模式与抽象工厂模式
上一节我们已经学习了原型模式,稍微复习一下:通过重写Object 类的clone() 方法实现浅克隆,浅克隆也要实现Cloneable 标记接口.而深克隆则是将对象通过序列化和反序列化 的方式进行创建 ...
- 深度学习“四大名著”发布!Python、TensorFlow、机器学习、深度学习四件套!
Python 程序员深度学习的"四大名著": 这四本书着实很不错!我们都知道现在机器学习.深度学习的资料太多了,面对海量资源,往往陷入到"无从下手"的困惑出境. ...
- slow SQL
一.介绍 慢查询日志可用于查找需要很长时间才能执行的查询,因此是优化的候选者.但是,检查长慢的查询日志可能是一项耗时的任务. 二.配置 # 查看: slow_query_log 慢SQL开关 slow ...
- html+css快速入门教程(3)
练习: 1.画盒子 2.相框 5 基础选择器 5.1 id选择器 ID选择器与类选择器的定义与引用方式类似,只是定义的符号不一样.ID通常表示唯一值,因此,ID选择器在CSS 中通常只出现一次.如果出 ...
- 恕我直言你可能真的不会java第8篇-函数式接口
一.函数式接口是什么? 所谓的函数式接口,实际上就是接口里面只能有一个抽象方法的接口.我们上一节用到的Comparator接口就是一个典型的函数式接口,它只有一个抽象方法compare. 只有一个抽象 ...