Django视图层

一、请求与响应

视图函数

视图函数,简称视图,属于Django的视图层,默认定义在views.py文件中,是用来处理web请求信息以及返回响应信息的函数,所以研究视图函数只需熟练掌握两个对象即可:请求对象(HttpRequest)和响应对象(HttpResponse)

1、请求对象

当一个页面被请求时,django会创建一个包含本次请求原信息(如http协议请求报文中的请求行、首部信息、内容主体)的HttpRequest对象。

之后,django会找到匹配的视图,将该对象传给视图函数的第一个参数,约定俗称该参数名为request(类似于我们自定义框架的environ参数)。

在视图函数中,通过访问该对象的属性便可以提取http协议的请求数据

2、HttpRequest对象属性part1

一.HttpRequest.method获取请求使用的方法(值为纯大写的字符串格式)。例如:"GET"、"POST"应该通过该属性的值来判断请求方法在视图函数中:if request.method. == "GET":...if request.method == "POST":...二.HttpRequest.GET值为一个类似于字典的QueryDict对象,封装了GET请求的所有参数,可通过HttpRequest.GET.get('键')获取相对应的值在视图函数中:request.GET.get('name')三.HttpRequest.POST值为一个类似于字典的QueryDict对象,封装了POST请求所包含的表单数据,可通过HttpRequest.POST.get('键')获取相对应的值在视图函数中:request.POST.get('name')针对表单中checkbox类型的input标签、select标签提交的数据,键对应的值为多个,需要用:HttpRequest.POST.getlist("hobbies")获取存有多个值的列表,同理也有HttpRequest.GET.getlist("键")针对有多个值的的情况,也可以用HttpRequest.GET.get("键"),默认会获取列表中的最后一个值

案例:

urls.py

from django.urls import re_path
from app01 import viewsurlpatterns = [re_path(r'^login/$',views.login),
]

 Views.py

from django.shortcuts import render,HttpResponsedef login(request):if request.method == 'GET':# 当请求url为:http://127.0.0.1:8001/login/?a=1&b=2&c=3&c=4&c=5# 请求方法是GET,?后的请求参数都存放于request.GET中print(request.GET)# 输出<QueryDict: {'a': ['1'], 'b': ['2'], 'c': ['3', '4', '5']}># 获取?后参数的方式为a=request.GET.get('a') # 1b=request.GET.get('b') # 2c=request.GET.getlist('c') # ['3', '4', '5']c1=request.GET.get('c') # 5return render(request,'login.html')elif request.method == 'POST':# 在输入框内输入用户名egon、年龄18,选择爱好,点击提交# 请求方法为POST,表单内的数据都会存放于request.POST中print(request.POST) # 输出<QueryDict: {..., 'name': ['egon'], 'age': ['18'], 'hobbies': ['music', 'read']}># 获取表单中数据的方式为name=request.POST.get('name') # egonage=request.POST.get('age') # 18hobbies=request.POST.getlist('hobbies') # ['music', 'read']return HttpResponse('提交成功')

 在templates目录下新建login.html

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>登录页面</title>
</head>
<body><!--
method="post"代表在提交表单时会以POST方法提交表单数据
action="/login/" 代表表单数据的提交地址为http://127.0.0.1:8001/login/,可以简写为action="/login/",或者action=""
-->
<form action="http://127.0.0.1:8001/login/" method="post">{% csrf_token %} <!--强调:必须加上这一行,后续我们会详细介绍--><p>用户名:<input type="text" name="name"></p><p>年龄:<input type="text" name="age"></p><p>爱好:<input type="checkbox" name="hobbies" value="music">音乐<input type="checkbox" name="hobbies" value="read">阅读<input type="checkbox" name="hobbies" value="dancing">跳舞</p><p><input type="submit" value="提交"></p></form>
</body>
</html>

3、HttpRequest对象属性part2

一.HttpRequest.path获取url地址的路径部分,只包含路径部分二.HttpRequest.get_full_path()获取url地址的完整path,既包含路径又包含参数部分如果请求地址是http://127.0.0.1:8001/order/?name=egon&age=10#_label3,
HttpRequest.path的值为"/order/"
HttpRequest.get_full_path()的值为"/order/?name=egon&age=10"

案例:

urls.py

from django.urls import path,register_converter,re_path
from app01 import viewsurlpatterns = [re_path(r'^order',views.order),
]

views.py

from django.shortcuts import render,HttpResponse# 针对请求的url地址:http://127.0.0.1:8001/order/?name=egon&age=10#_label3
# 从域名后的最后一个“/”开始到“?”为止是路径部分,即/order/
# 从“?”开始到“#”为止之间的部分为参数部分,即name=egon&age=10
def order(request):print(request.path) # 结果为“/order/”print(request.get_full_path()) # 结果为"/order/?name=egon&age=10"return HttpResponse('order page')

4、HttpRequest对象属性part3

一.HttpRequest.META.get(...)值为包含了HTTP协议的请求头数据的Python字典,字典中的key及期对应值的解释如下CONTENT_LENGTH —— 请求的正文的长度(是一个字符串)。CONTENT_TYPE —— 请求的正文的MIME类型。HTTP_ACCEPT —— 响应可接收的Content-Type。HTTP_ACCEPT_ENCODING —— 响应可接收的编码。HTTP_ACCEPT_LANGUAGE —— 响应可接收的语言。HTTP_HOST —— 客服端发送数据的目标主机与端口HTTP_REFERER —— Referring 页面。HTTP_USER_AGENT —— 客户端使用的软件版本信息QUERY_STRING —— 单个字符串形式的查询字符串(未解析过的形式)。REMOTE_ADDR —— 客户端的IP地址。REMOTE_HOST —— 客户端的主机名。REMOTE_USER —— 服务器认证后的用户。REQUEST_METHOD —— 一个字符串,例如"GET" 或"POST"。SERVER_NAME —— 服务器的主机名。SERVER_PORT —— 服务器的端口(是一个字符串)。从上面可以看到,除 CONTENT_LENGTH 和 CONTENT_TYPE 之外,HTTP协议的请求头数据转换为 META 的键时,都会1、将所有字母大写2、将单词的连接符替换为下划线3、加上前缀HTTP_。所以,一个叫做 X-Bender 的头部将转换成 META 中的 HTTP_X_BENDER 键。二、HttpRequest.encoding一个字符串,表示提交的数据的编码方式(如果为 None 则表示使用 DEFAULT_CHARSET 的设置,默认为 'utf-8')。这个属性是可写的,你可以修改它来修改访问表单数据使用的编码。接下来对属性的任何访问(例如从 GET 或 POST 中读取数据)将使用新的 encoding 值。如果你知道表单数据的编码不是 DEFAULT_CHARSET ,则使用它。三、HttpRequest.scheme表示请求方案的字符串(通常为http或https)四、其他
HttpRequest还有很多其他重要属性,比如HttpRequest.body,待我们讲到专门的知识点时再专门详细讲解

5、响应对象

请求对象HttpRequest是由django为我们创建好的,直接使用即可,而响应对象则需要我们负责创建。我们编写的每个视图都应该返回一个HttpResponse对象,响应可以是一个网页的HTML内容,一个重定向,一个404错误,一个XML文档,或者一张图片。用来返回响应对象的常用类如下

from django.shortcuts import HttpResponse
from django.shortcuts import redirect
from django.shortcuts import renderfrom django.http importJsonResponse

6、HttpResponse 

from django.http import HttpResponse
response = HttpResponse("Here's the text of the Web page.")
response = HttpResponse("Text only, please.", content_type="text/plain")'''
ps:Content-Type用于指定响应体的MIME类型MIME类型:
mime类型是多用途互联网邮件扩展类型。是设定某种扩展名的文件用一种应用程序来打开的方式类型,当该扩展名文件被访问的时候,浏览器会自动使用指定应用程序来打开MIME 类型有非常多种,一般常见的有:text/html:浏览器在获取到这种文件时会自动调用html的解析器对文件进行相应的处理。text/plain:意思是将文件设置为纯文本的形式,浏览器在获取到这种文件时并不会对其进行处理。image/jpeg:JPEG格式的图片image/gif:GIF格式的图片video/quicktime:Apple 的 QuickTime 电影application/vnd.ms-powerpoint:微软的powerpoint文件
'''

7、render

def render(request, template_name, context=None, content_type=None, status=None, using=None):"""Return a HttpResponse whose content is filled with the result of callingdjango.template.loader.render_to_string() with the passed arguments."""content = loader.render_to_string(template_name, context, request, using=using)return HttpResponse(content, content_type, status)参数:1、request:用于生成响应的请求对象,固定必须传入的第一个参数2、template_name:要使用的模板的完整名称,必须传入,render默认会去templates目录下查找模板文件3、context:可选参数,可以传入一个字典用来替换模块文件中的变量,默认是一个空字典。如果字典中的某个值是可调用的,视图将在渲染模板之前调用它。4、content_type:生成的文档要使用的MIME类型。默认为 DEFAULT_CONTENT_TYPE 设置的值。默认为'text/html'5、status:响应的状态码。默认为200。6、using: 用于加载模板的模板引擎的名称。

8、redirect
 

返回重定向对象,返回的状态码为302,第一个参数用来指定浏览器重定向的地址,可以是
#1、一个完全标准的URL地址,如'https://www.yahoo.com/search/'
#2、也可以是一个没有域名的绝对路径,如'/search/'
#3、或者是一个没有域名的相对路径,如'search/',与1、2直接跳转到指定的绝对路径不同,相对路径需要先与当前路径进行拼后才能跳转,例如:如果当前路径为http://127.0.0.1:8080/index/,拼接后的路径为http://127.0.0.1:8080/index/search/# ps:redirect重定向等同于下述操作
def index(request):response=HttpResponse()response.status_code=302 # 必须设置响应的状态码,才能重定向response['Location']='/register/' # 设置响应头return response

9、JsonResponse

向前端返回一个json格式字符串的两种方

方式一:

import jsondef my_view(request):data=['egon','kevin']return HttpResponse(json.dumps(data) )

方式二:

from django.http import JsonResponsedef my_view(request):data=['egon','kevin']return JsonResponse(data,safe=False)#默认safe=True代表只能序列化字典对象,safe=False代表可以序列化字典以外的对象

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/178864.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

web:[ZJCTF 2019]NiZhuanSiWei1

题目 点进题目&#xff0c;网页显示如下&#xff0c;需要代码审计 $_GET["text"]和$_GET["file"]来获取传入的两个参数text和file。使用isset()函数来检查$text变量是否已设置并且不为null。如果设置了并且不为null&#xff0c;则执行下面的逻辑。在下面的…

贪心算法(新坑)

贪心入门 概述&#xff1a; 贪心算法是一种在每一步选择中都采取当前最优解的策略&#xff0c;希望最终能够得到全局最优解的算法。简单来说&#xff0c;它会不断地做出局部最优的选择&#xff0c;相信通过这种选择最终能够达到全局最优。 举个例子来说明。假设你要从一个迷…

CCFCSP试题编号:202206-2试题名称:寻宝!大冒险!

一、题目 二、分析 因为藏宝图左下角位置一定是一棵树&#xff0c;所以只要把所有绿化图中每一棵树&#xff0c;与之相匹配&#xff0c;然后判断&#xff0c;是否整个藏宝图都是绿化图的一部分&#xff0c;如果是那就计数count1。所以来看&#xff0c;结果count最大也就是n(绿…

js 函数的防抖(debounce)与节流(throttle)

目录 序言&#xff1a; 防抖&#xff08;debounce&#xff09; 节流&#xff08;throttle&#xff09; 代码示例 附录&#xff1a; 关于节流/防抖函数中 context&#xff08;this&#xff09; 的指向解析&#xff1a; 防抖函数中的 this 指向 节流函数中的 this 指向 序…

进程和线程的关系

⭐ 作者&#xff1a;小胡_不糊涂 &#x1f331; 作者主页&#xff1a;小胡_不糊涂的个人主页 &#x1f4c0; 收录专栏&#xff1a;JavaEE &#x1f496; 持续更文&#xff0c;关注博主少走弯路&#xff0c;谢谢大家支持 &#x1f496; 进程&线程 1. 什么是进程PCB 2. 什么是…

高等数学零基础篇复习笔记

预备章 零基础高等数学入门知识 第一节 集合、运算与关系 第二节 三角函数与反三角函数 三角函数的公式 反三角函数 第三节 常见不等式及数列 划重点 第一章 函数、极限与连续 第一节 函数及函数的初等特性 特殊函数 反函数 函数的初等特性 ①有界性 ②奇偶性 偶函数图像…

高中生分科考试--座位编排系统

这个系统是帮我一同学的哥哥的做的座位编排系统&#xff0c;他是某个学校的教育从事者 基本需求&#xff1a;就是能够根据他提供的各个分科班级同学的成绩单来选择相同分科的考场编排&#xff08;按成绩高低&#xff09;&#xff0c;同时输入相应的考场数&#xff0c;和每个考…

OpenJudge NOI 1.8 16:矩阵剪刀石头布 c语言

描述 Bart的妹妹Lisa在一个二维矩阵上创造了新的文明。矩阵上每个位置被三种生命形式之一占据&#xff1a;石头&#xff0c;剪刀&#xff0c;布。每天&#xff0c;上下左右相邻的不同生命形式将会发生战斗。在战斗中&#xff0c;石头永远胜剪刀&#xff0c;剪刀永远胜布&#…

解决git action发布报错:Input required and not supplied: upload_url

现象&#xff1a; 这个问题死活都找不到原因&#xff0c;后来打了一段调试的代码 - name: Debug Create Release Output run: | echo "Release ID: ${{ env.RELEASE_ID }}" echo "Release Upload URL: ${{ env.RELEASE_UPLOAD_URL }}" env: RELEASE_ID: ${…

05-鸿蒙学习之State、Prop、Link用法

05-鸿蒙学习之State、Prop、Link用法 Entry Component struct StateMangement {// State 必须初始化State name: string Hello Worldbuild() {Row() {Column() {Text(this.name).StateMangement_textStyle()Button(点击).StateMangement_btnStyle(() > {this.name this.n…

JAVA技术栈JVM

**Java虚拟机&#xff08;JVM&#xff09;详细概述** Java虚拟机&#xff08;Java Virtual Machine&#xff0c;简称JVM&#xff09;是Java平台的关键组成部分&#xff0c;负责在不同操作系统上执行Java字节码。它提供了内存管理、垃圾回收、安全性等关键功能&#xff0c;使得…

[nlp] 多语言大模型不同语种/语系数据的数据配比调节

在训练多语言的大型语言模型时,调整不同语种或语系数据的比例是一个重要的问题。理想情况下,模型应该能够平等地理解并生成所有支持的语言。然而,由于某些语言的数据可能比其他语言更容易获得(例如英语比哈萨克语),因此需要采取特定的策略来确保模型不会偏向于那些数据更…

docker镜像原理

什么是镜像 容器解决应用开发、测试和部署的问题&#xff0c;而镜像解决应用部署环境问题。镜像是一个只读的容器模板&#xff0c; 打包了应用程序和应用程序所依赖的文件系统以及启动容器的配置文件&#xff0c;是启动容器的基础。镜像所打 包的文件内容就是容器的系统运行环…

C++初阶--String类的使用

string类 在C语言中&#xff0c;我们总是用char* 的类型来创建一个变量&#xff0c;存储一个字符串&#xff1b;当我们想对它进行修改或者读写时&#xff0c;需要自我创建空间和使用string.h的库函数来进行操作它&#xff1b; 而在C中&#xff0c;C专门提供了一个头文件 stri…

HNU练习七 字符串编程题7. 机器人游戏

【问题描述】 有人建造了一些机器人&#xff0c;并且将他们放置在包含n个单元的一维网格上&#xff0c;一个长度为n的字符串s代表了他们的编排方式&#xff0c;字符串中的字符既可以是.&#xff0c;也可以是0~9之间的一个数字字符&#xff0c;字符.表示开始时在相应的单元上无机…

RESTful API构建web应用程序的步骤2023

RESTful API是一种基于HTTP协议的API架构风格&#xff0c;它允许客户端和服务器之间传输数据并进行交互。REST是Representational State Transfer的缩写&#xff0c;它强调资源的状态转换&#xff0c;以及通过 URI、HTTP方法等方式对资源进行操作。 使用RESTful API构建web应用…

028 - STM32学习笔记 - ADC(二) 独立模式单通道中断采集

028 - STM32学习笔记 - 结构体学习&#xff08;二&#xff09; 上节对ADC基础知识进行了学习&#xff0c;这节在了解一下ADC相关的结构体。 一、ADC初始化结构体 在标准库函数中基本上对于外设都有一个初始化结构体xx_InitTypeDef&#xff08;其中xx为外设名&#xff0c;例如…

智能优化算法应用:基于阴阳对算法无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用&#xff1a;基于阴阳对算法无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用&#xff1a;基于阴阳对算法无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.阴阳对算法4.实验参数设定5.算法结果6.参考文献7.…

《2023全球隐私计算报告》正式发布!

2023全球隐私计算报告 1、2023全球隐私计算图谱2、国内外隐私计算相关政策3、隐私计算技术的最新发展4、隐私计算技术的合规挑战5、隐私计算的应用市场动态6、隐私计算开源整体趋势7、隐私计算的未来趋势 11月23日&#xff0c;由浙江省人民政府、商务部共同主办&#xff0c;杭州…

智慧化工~工厂设备检修和保全信息化智能化机制流程

化工厂每年需要现场检修很多机器&#xff0c;比如泵、压缩机、管道、塔等等&#xff0c;现场检查人员都是使用照相机&#xff0c;现场拍完很多机器后&#xff0c;回办公室整理乱糟糟的照片&#xff0c;但是经常照了之后无法分辨是哪台设备&#xff0c;而且现场经常漏拍&#xf…