Django之视图的使用
创始人
2025-05-31 07:12:27

Django之视图的使用

  • 视图
  • 基本使用
    • 函数视图
    • 类视图
    • 视图与模板
  • 请求对象HttpRequest
    • 常见属性和方法
    • Get、POST、请求头示例
    • QueryDict对象
    • 查询字符串Query String
    • 请求体
  • 响应对象HttpResponse
    • 常见属性和方法
    • 基本使用
    • 自定义HTTP响应
    • HttpResponse子类
    • 重定向
  • Cookie操作
    • 设置Cookie
    • 读取Cookie
    • 删除Cookie
  • Session
    • 启用Session
    • 存储方式
    • Session操作

视图

Django的视图是一个Python函数或类,是处理业务逻辑的核心,它负责处理用户的请求并返回响应数据。它们接收HTTP请求并返回一个HTTP响应,通常用于呈现HTML网页或API响应。

特点:

1.视图函数或类通常放在项目、应用的views.py文件中2.视图的第一个参数必须为HttpRequest对象,可能包含参数(通过正则表达式获取位置参数、关键字参数)3.视图必须返回一个HttpResponse对象或子对象(JsonResponse HttpResponseRedirect)作为响应	4.视图负责接受Web请求HttpRequest,进行逻辑处理,返回Web响应HttpResponse给请求者5.响应内容可以是HTML内容,404错误,重定向,json数据

基本使用

函数视图

基于函数的视图是一个简单的Python函数,它接受一个HttpRequest对象作为参数,并返回一个HttpResponse对象。

from django.shortcuts import render
from django.http import HttpResponsedef hello(request):return HttpResponse("Hello, world!")

配置路由时,使用views.视图函数名添加

from django.urls import pathfrom user import viewsurlpatterns = [path('test/', views.hello),
]

类视图

基于类的视图是一个继承自View类或其子类的Python类,该方法接收一个request对象,并返回一个HttpResponse对象作为响应。与函数视图不同,类视图采用基于类的方式管理代码,可以更好地组织复杂的代码逻辑。

类视图实现一个get方法:

from django.views import View
from django.http import HttpResponseclass HelloView(View):def get(self, request):return HttpResponse("Hello, world!")

配置路由时,使用类视图的as_view()方法来添加。

from django.urls import pathfrom user.views import LoginViewurlpatterns = [path('test/', HelloView.as_view())
]

视图与模板

视图还可以与模板一起使用,以生成动态的HTML网页。在这种情况下,视图将数据传递给模板,模板将数据呈现为HTML页面。

在视图中定义一个名为name的变量,并将其作为上下文传递给名为hello.html的模板。

from django.shortcuts import renderdef hello(request):name = "Alice"return render(request, 'hello.html', {'name': name})

在模板中,可以使用变量来呈现动态内容,使用{{ name }}标记来表示name变量的值。此值将在呈现网页时替换为实际的变量值。



Hello, {<!-- -->{<!-- --> name }}

Hello, {{ name }}!

请求对象HttpRequest

在Django中,HttpRequest对象是一个包含HTTP请求信息的数据结构,它是处理Django视图和模板的关键组成部分。每当Django应用程序接收到HTTP请求时,都会创建一个HttpRequest对象,并将其作为参数传递给相应的视图函数或方法。

常见属性和方法

request.META: 一个包含所有HTTP请求头的字典,可以通过该字典获取客户端的IP地址、浏览器类型和版本、操作系统等信息request.GET: 一个包含所有GET参数的字典,也可以通过request.GET.get()方法获取单个参数request.POST: 一个包含所有POST参数的字典,也可以通过request.POST.get()方法获取单个参数request.COOKIES: 一个包含所有Cookie的字典,也可以通过request.COOKIES.get()方法获取单个Cookierequest.FILES: 一个包含所有上传文件的字典,也可以通过request.FILES.get()方法获取单个文件request.method: 表示HTTP请求的方法,如GET、POST等request.path: 表示请求的URL路径(不包括查询字符串)request.get_host(): 获取HTTP请求的主机名request.get_port(): 获取HTTP请求的端口号request.body: 表示HTTP请求正文的原始字节数据request.scheme: 表示HTTP请求使用的协议,如http或httpsrequest.is_secure(): 返回True表示当前请求使用HTTPS协议,否则返回False。# HttpRequest对象request.user: 表示当前登录用户的User对象(如果用户已经登录),否则为匿名User对象request.session: 表示当前用户的会话信息,可以用于在请求之间存储和访问数据request.resolver_match: 包含与当前请求URL匹配的ResolverMatch对象,其中包含URL模式匹配信息request.is_ajax(): 返回True表示当前请求是通过Ajax发送的,否则返回Falserequest.is_preview(): 返回True表示当前请求是一个预览请求,例如在Django admin中,否则返回Falserequest.content_params: 一个字典,表示HTTP请求正文的MIME类型和字符编码request.content_type: 表示HTTP请求正文的MIME类型request.encoding: 表示HTTP请求正文的字符编码request.upload_handlers: 一个上传处理器列表,用于处理HTTP请求中的文件上传数据request.path_info: 表示HTTP请求的URL路径(包括查询字符串)

Get、POST、请求头示例

1.Get

GET是一种HTTP请求方法,用于从服务器获取资源。

GET请求通常用于从服务器请求静态资源或查询数据。

通过request.GET访问包含所有GET请求参数的字典。

从request.GET中获取名为name的参数,并将其用于生成响应内容。如果未提供name参数,则默认值为’World’。

from django.http import HttpResponsedef my_view(request):name = request.GET.get('name', 'World')return HttpResponse('Hello, {}!'.format(name))

通过URL配置将GET请求路由到特定的视图函数或类

from django.urls import path
from . import viewsurlpatterns = [path('hello/', views.my_view, name='my-view'),
]

2.POST

POST是一种HTTP请求方法,用于向服务器提交数据。

POST请求通常用于在服务器上创建、更新或删除资源,并允许客户端向服务器提交表单数据。

通过request.POST访问包含所有POST参数的字典

1.检查request.method是否为’POST’,以确保只有在收到POST请求时才执行

2.从request.POST中获取名为name的参数,并将其用于生成响应内容。

from django.http import HttpResponsedef my_view(request):if request.method == 'POST':name = request.POST.get('name')return HttpResponse('Hello, {}!'.format(name))else:return HttpResponse('Please submit a form.')

3.请求头

可以通过request.META属性获取请求头headers中的数据,request.META为字典类型,通过request.META['CONTENT_TYPE']方式获取具体请求头值

常见请求头:

CONTENT_LENGTH– The length of the request body (as a string).
CONTENT_TYPE– The MIME type of the request body.
HTTP_ACCEPT– Acceptable content types for the response.
HTTP_ACCEPT_ENCODING– Acceptable encodings for the response.
HTTP_ACCEPT_LANGUAGE– Acceptable languages for the response.
HTTP_HOST– The HTTP Host header sent by the client.
HTTP_REFERER– The referring page, if any.
HTTP_USER_AGENT– The client’s user-agent string.
QUERY_STRING– The query string, as a single (unparsed) string.
REMOTE_ADDR– The IP address of the client.
REMOTE_HOST– The hostname of the client.
REMOTE_USER– The user authenticated by the Web server, if any.
REQUEST_METHOD– A string such as"GET"or"POST".
SERVER_NAME– The hostname of the server.
SERVER_PORT– The port of the server (as a string).
def userList(request):print(request.META['CONTENT_TYPE'])print(request.META['Token'])return HttpResponse('ok')

QueryDict对象

HttpRequest对象的属性GET、POST都是QueryDict类型的对象,QueryDict类型的对象用来处理同一个键带有多个值的情况

get()方法:

根据键获取值,如果一个键同时拥有多个值将获取最后一个值。如果键不存在则返回None值,可以设置默认值进行后续处理

get('键',默认值)

getlist()方法:

根据键获取值,值以列表返回,可以获取指定键的所有值。如果键不存在则返回空列表[],可以设置默认值进行后续处理

getlist('键',默认值)

查询字符串Query String

获取请求路径中的查询字符串参数,如:https://www.baidu.com/query?k1=v1&k2=v2,可以通过request.GET属性获取,返回QueryDict对象。

询字符串不区分请求方式,即假使客户端进行POST方式的请求,依然可以通过request.GET获取请求中的查询字符串数据。

请求:http://127.0.0.1:8000/user/userList/?a=1&b=2&a=3

from django.http import HttpResponsedef userList(request):params = request.GETprint('params: ', params)print('a:', params['a'])b = request.GET.get('b')print('b:', b)list = params.getlist('a')print('list:', list)return HttpResponse("ok")
params:  'a': ['1', '3'], 'b': ['2']}>
a: 3
b: 2
list: ['1', '3']

请求体

在Django中,可以使用request.body属性访问HTTP请求的消息体。

request.body是一个包含HTTP请求正文的原始字节数据的字节数组,而不是字符串。如果要将其转换为字符串,则可以使用request.body.decode(‘utf-8’)方法。

1.CSRF防护

由于请求体数据格式不固定,可以是表单类型字符串,可以是JSON字符串,可以是XML字符串,因此需要使用不同的请求方式。

常见的发送请求体数据的请求方式有POST、PUT、PATCH、DELETE等。

Django默认开启了CSRF防护,会对上述请求方式进行CSRF防护验证,在测试时可以关闭CSRF防护机制,方法为在settings.py文件中注释掉CSRF配置

MIDDLEWARE = ['django.middleware.security.SecurityMiddleware','django.contrib.sessions.middleware.SessionMiddleware','django.middleware.common.CommonMiddleware',# 'django.middleware.csrf.CsrfViewMiddleware','django.contrib.auth.middleware.AuthenticationMiddleware','django.contrib.messages.middleware.MessageMiddleware','django.middleware.clickjacking.XFrameOptionsMiddleware',
]

2.表单类型Form Data
发送的表单类型的请求体数据,可以通过request.POST属性获取,返回QueryDict对象。

from django.http import HttpResponsedef userList(request):params = request.POSTprint('params: ', params)print('a:', params['a'])b = request.GET.get('b')print('b:', b)list = params.getlist('a')print('list:', list)return HttpResponse("ok")

在这里插入图片描述

params:  'a': ['1'], 'b': ['2'], 'c': ['3']}>
a: 1
b: None
list: ['1']

3.非表单类型 Non-Form Data

非表单类型的请求体数据,Django无法自动解析,需要通过request.body属性获取最原始的请求体数据,然后按照请求体格式(JSON、XML等)进行解析。request.body返回bytes类型。

假设请求体中的的JSON数据如下:

{"a": 1, "b": 2}

使用json.loads()方法将其转换为Python对象,然后进行如下操作:

import json
from django.http import HttpResponsedef userList(request):str = request.bodyprint('str: ', str)data = json.loads(str)print('a: ', data['a'])print('b: ', data['b'])return HttpResponse('ok')
str:  b'{"a":1,"b":2}'
a:  1
b:  2

响应对象HttpResponse

在Django中,HttpResponse对象用于表示HTTP响应。当视图函数或方法返回一个HttpResponse对象时,Django将此对象转换为HTTP响应并发送到客户端。

开发者可以使用HttpResponse对象的属性和方法来自定义HTTP响应,例如设置状态码、字符编码、HTTP头或Cookie等。

常见属性和方法

content: 表示HTTP响应正文的字节数据。status_code: 表示HTTP状态码,如200、404等。charset: 表示HTTP响应正文的字符编码。content_type: 表示HTTP响应正文的MIME类型。write(): 将指定字符串或字节数据写入HTTP响应正文。flush(): 将HTTP响应正文刷新到客户端。set_cookie(): 设置一个新的Cookie。delete_cookie(): 删除指定的Cookie。has_header(): 返回True表示该响应包含指定的HTTP头,否则返回False。get(): 获取指定HTTP头的值。

基本使用

使用django.http.HttpResponse来构造响应对象。如果没有指定其他属性或方法,Django将使用默认的HTTP状态码(200 OK)和字符编码(UTF-8)

HttpResponse(content=响应体, content_type=响应体数据类型, status=状态码)
from django.http import HttpResponsedef userList(request):# 创建一个HttpResponse对象,并将字符串'ok'作为响应正文。return HttpResponse('ok', status=500)

自定义HTTP响应

通过HttpResponse对象属性来设置响应体、响应体数据类型、状态码

content:表示返回的内容status_code:返回的HTTP响应状态码

直接将HttpResponse对象当做字典进行响应头键值对的设置

response = HttpResponse()
response['Token'] = 'abcd'
from django.http import HttpResponsedef userList(request):response = HttpResponse('ok')response.status_code = 500response['Token'] = 'abcd'return response

HttpResponse子类

除了使用HttpResponse对象来创建HTTP响应外,还可以创建自定义的子类来表示特定类型的HTTP响应。这些子类通常用于表示带有特殊格式或内容的HTTP响应。

在使用子类的HttpResponse对象时,可以根据需要添加额外的属性和方法以自定义HTTP响应。例如,在创建FileResponse对象时,可以指定文件名、MIME类型和缓冲区大小等参数。

常见的HttpResponse子类:

JsonResponse: 表示JSON格式的HTTP响应FileResponse: 表示文件下载的HTTP响应HttpResponseRedirect: 表示重定向的HTTP响应HttpResponseBadRequest: 表示HTTP 400 Bad Request错误的HTTP响应HttpResponseNotFound: 表示HTTP 404 Not Found错误的HTTP响应HttpResponseServerError: 表示HTTP 500 Internal Server Error错误的HTTP响应

JsonResponse

若要返回json数据,可以使用JsonResponse来构造响应对象

作用:

帮助将数据转换为json字符串设置响应头Content-Type为application/json

使用JsonResponse子类返回JSON格式的HTTP响应

from django.http import JsonResponsedef userList(request):return JsonResponse({'a': '123', 'b': '456'})

重定向

创建一个HttpResponseRedirect对象,并将其初始化为重定向到/new-url/的URL地址。客户端收到此响应后会自动发送一个新的HTTP请求以获取新的URL内容。

注意: 必须指定完整的URL地址或相对路径。

from django.http import HttpResponseRedirectdef my_view(request):return HttpResponseRedirect('/new-url/')

如果不想硬编码URL地址,则可以使用reverse()函数来生成URL,它接受一个URL模式名称和一个可选的参数列表,并返回与该模式匹配的URL地址。

from django.urls import reverse
from django.http import HttpResponseRedirectdef my_view(request):url = reverse('myapp:myview')return HttpResponseRedirect(url)

可以使用redirect()函数实现重定向。redirect()函数是一个快捷方式,用于创建HttpResponseRedirect对象。

from django.shortcuts import redirectdef response(request):return redirect('/index')

Cookie操作

设置Cookie

通过HttpResponse对象中的set_cookie方法来设置cookie

HttpResponse.set_cookie(cookie名, value=cookie值, max_age=cookie有效期)

max_age单位为秒,默认为None 。如果是临时cookie,可将max_age设置为None

def userList(request):response = HttpResponse('ok')response.set_cookie('token1', 'token123')  # 临时cookieresponse.set_cookie('token2', 'token123', max_age=3600)  # 有效期一小时return response

在这里插入图片描述

读取Cookie

通过HttpResponse对象的COOKIES属性来读取本次请求携带的cookie值。request.COOKIES为字典类型。

def userList(request):cookie = request.COOKIES.get('token2')print(cookie )return HttpResponse('ok')

删除Cookie

通过HttpResponse对象中的delete_cookie方法来删除。

def userList(request):response.delete_cookie('token2')return HttpResponse('ok')

Session

启用Session

Django项目默认启用Session。在settings.py文件中配置是否启动Session,注释即禁用。

MIDDLEWARE = ['django.contrib.sessions.middleware.SessionMiddleware',
]

存储方式

在settings.py文件中,可以设置session数据的存储方式,可以保存在数据库、本地缓存等。

1.数据库
如果存储在数据库中,需要在项目settings.py文件中,INSTALLED_APPS项安装Session应用。

INSTALLED_APPS = ['django.contrib.sessions',# 添加注册子应用'user.apps.UserConfig',
]

存储在数据库中,如下设置可以写,也可以不写,这是默认存储方式,在项目settings.py文件中配置即可。

SESSION_ENGINE='django.contrib.sessions.backends.db'

对应数据库中的:django_session表,表由三个字段组成:键,值,过期时间。

CREATE TABLE `django_session` (`session_key` varchar(40) NOT NULL,`session_data` longtext NOT NULL,`expire_date` datetime(6) NOT NULL,PRIMARY KEY (`session_key`),KEY `django_session_expire_date_a5c62663` (`expire_date`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8

2.本地缓存
存储在本机内存中,如果丢失则不能找回,比数据库的方式读写更快。

SESSION_ENGINE='django.contrib.sessions.backends.cache'

3.混合存储
优先从本机内存中存取,如果没有则从数据库中存取。

SESSION_ENGINE='django.contrib.sessions.backends.cached_db'

4.Redis

在redis中保存session,需要引入第三方扩展,可以使用django-redis来解决。

安装

pip install django-redis

在settings.py文件中配置

CACHES = {'default': {'BACKEND': 'django_redis.cache.RedisCache','LOCATION': 'redis://127.0.0.1:6379/1','OPTIONS': {'CLIENT_CLASS': 'django_redis.client.DefaultClient',}}
}
SESSION_ENGINE = 'django.contrib.sessions.backends.cache'
SESSION_CACHE_ALIAS = 'default'

Session操作

通过HttpRequest对象的session属性进行会话的读写操作。

以键值对的格式写session。

request.session['键']=值

根据键读取值。

request.session.get('键',默认值)

清除所有session,在存储中删除值部分。

request.session.clear()

清除session数据,在存储中删除session的整条数据。

request.session.flush()

删除session中的指定键及值,在存储中只删除某个键及对应的值。

del request.session['键']

设置session的有效期

request.session.set_expiry(value)
如果value是一个整数,session将在value秒没有活动后过期如果value为0,那么用户session的Cookie将在用户的浏览器关闭时过期如果value为None,那么session有效期将采用系统默认值, 默认为两周,可以通过在settings.py中设置SESSION_COOKIE_AGE来设置全局默认值。

相关内容

热门资讯

游戏服务器是什么怎么租用 游戏服务器是什么怎么租用 我是艾西,作为一个常年与游戏行业保持着高频率的服务器供应商&...
Flink-转换算子  基本转换算子         map(映射)         filter(过滤&#...
2023年金三银四大厂高频Ja... Java 面试 谈到 Java 面试,相信大家第一时间脑子里想到的词肯定是金三银四&#...
C语言手撕一个Hash表(Ha... 什么是Hash Table 散列表用的是数组支持按照下标随机访问数据的特性,所以散列表...
springMVC01- 文章目录今日目标一、SpringMVC简介1 SpringMVC概述问题导入1.1 SpringMV...
Electron开发的应用利用... 技术选型: 1、electron:21.3.3 2、electron-v...
【Elastic (ELK) ... 目录 一、ES 基本概念介绍 1.1 ES 是什么 1.2 ES 主要功能 1.3 ES 相关术语 ...
指定wb用户在指定日期范围内的... 一、操作步骤 只记录过程,不讲述原理 1.获取用户ID和cookie 用户ID在进入个...
sheng的学习笔记-IO多路... 基础概念IO分为几种:同步阻塞的BIO,同步非阻塞的NIO,...
接口自动化测试(Python+...  目录:导读 (1)接口自动化测试的优缺点 (2)Pyth...
重构条件-Consolidat... 重构条件-Consolidate Conditional Expression合并条件式二 1.合并...
【论文阅读】BiSeNet V... 前言BiSeNet V2延续了v1版本的双边结构,分别处理空间细节信息、高层语义信息。...
二、马尔可夫决策过程与贝尔曼方... 这里写目录标题1 马尔可夫性质2 马尔可夫过程3 马尔可夫奖励过程(Markov re...
golang端口重用 文章目录前言SO_REUSEADDR简介Python中的用法golang用法其他学习总结 前言 服...
Zabbix“专家坐诊”第18... 问题一 Q:Zabbix5.0版本,如图,请问这里怎么修改...
深度学习技巧应用5-神经网络中... 大家好,我是微学AI,今天给大家带来深度学习技巧应用5-神经网络中的模型...
Mongodb 常用基本语法与... 常用操作 1、 Help查看命令提示 db.help(); 2、 切换/创建数据库 use t...
java中Long型数据大小比... 起因 今天在做项目的时候,想构建一个树形结构,从数据库中查询出了所有数据...
【Linux】-- 进程概念 基本概念进程(Process):是操作系统进行资源分配的最小单位。一个进程是一个程序的一次执行过程。...
2023-03-22干活小计: transformer: position-embedding: 残差:我也会了 ad...
verilog(基础知识) 摘要:主要写自己的学习内容,可能不完整 概述 对硬件描述,主要是对芯片设计进行验证人员对其进行验证...
MySQL函数 - 字符串函数... 文章目录1 字符串函数2 数值函数3 日期函数4 流程函数 函数是指一段可以直接被另一段程序调用的程...
Word2010(详细布局解释... 目录一、界面介绍二、选项卡1、文件选项卡(保存、打开、新建、打印、保存并发送、选项&#...
ProTradex是链上衍生品... 目前,链上衍生品市场的总市值已经超过100亿美元,链上衍生品市场的产品类...
spring boot 集成 ... 要将 PostGIS 集成到 Spring Boot 应用程序中,需要按照以下步骤进行操作:1. 将...
【DDIM精读】公式推导加代码... 【DDIM精读】公式推导加代码分析。1.前言:ddim总览2.均值(μ\...
系统开发-McCabe复杂度(... 系统开发(上)-软件设计(三十二)https...
每日学术速递3.22 CV - 计算机视觉 |  ML - 机器学习 |  RL - 强化学习 | NLP 自然语言处理 ...
CCF-CSP题解 第二题(J... 目录 201312-2:ISBN号码 201403-2:窗口 20140...
在服务器上搭建nacos集群-... 搭建集群需要具备JDK环境,1个Nginx+3个nacos注册中心+1...