Django之视图的使用
视图
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 HttpResponse
def hello(request):
return HttpResponse("Hello, world!")
配置路由时,使用views.视图函数名添加
from django.urls import path
from user import views
urlpatterns = [
path('test/', views.hello),
]
类视图
基于类的视图是一个继承自View类或其子类的Python类,该方法接收一个request对象,并返回一个HttpResponse对象作为响应。与函数视图不同,类视图采用基于类的方式管理代码,可以更好地组织复杂的代码逻辑。
类视图实现一个get方法:
from django.views import View
from django.http import HttpResponse
class HelloView(View):
def get(self, request):
return HttpResponse("Hello, world!")
配置路由时,使用类视图的as_view()方法来添加。
from django.urls import path
from user.views import LoginView
urlpatterns = [
path('test/', HelloView.as_view())
]
视图与模板
视图还可以与模板一起使用,以生成动态的HTML网页。在这种情况下,视图将数据传递给模板,模板将数据呈现为HTML页面。
在视图中定义一个名为name的变量,并将其作为上下文传递给名为hello.html的模板。
from django.shortcuts import render
def hello(request):
name = "Alice"
return render(request, 'hello.html', {'name': name})
在模板中,可以使用变量来呈现动态内容,使用{{ name }}标记来表示name变量的值。此值将在呈现网页时替换为实际的变量值。
<!DOCTYPE html>
<html>
<head>
<title>Hello, {{ name }}</title>
</head>
<body>
<h1>Hello, {{ name }}!</h1>
</body>
</html>
请求对象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()方法获取单个Cookie
request.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或https
request.is_secure(): 返回True表示当前请求使用HTTPS协议,否则返回False。# HttpRequest对象
request.user: 表示当前登录用户的User对象(如果用户已经登录),否则为匿名User对象
request.session: 表示当前用户的会话信息,可以用于在请求之间存储和访问数据
request.resolver_match: 包含与当前请求URL匹配的ResolverMatch对象,其中包含URL模式匹配信息
request.is_ajax(): 返回True表示当前请求是通过Ajax发送的,否则返回False
request.is_preview(): 返回True表示当前请求是一个预览请求,例如在Django admin中,否则返回False
request.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 HttpResponse
def my_view(request):
name = request.GET.get('name', 'World')
return HttpResponse('Hello, {}!'.format(name))
通过URL配置将GET请求路由到特定的视图函数或类
from django.urls import path
from . import views
urlpatterns = [
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 HttpResponse
def 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 HttpResponse
def userList(request):
params = request.GET
print('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: <QueryDict: {'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 HttpResponse
def userList(request):
params = request.POST
print('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: <QueryDict: {'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 HttpResponse
def userList(request):
str = request.body
print('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 HttpResponse
def 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 HttpResponse
def userList(request):
response = HttpResponse('ok')
response.status_code = 500
response['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 JsonResponse
def userList(request):
return JsonResponse({'a': '123', 'b': '456'})
重定向
创建一个HttpResponseRedirect对象,并将其初始化为重定向到/new-url/
的URL地址。客户端收到此响应后会自动发送一个新的HTTP请求以获取新的URL内容。
注意: 必须指定完整的URL地址或相对路径。
from django.http import HttpResponseRedirect
def my_view(request):
return HttpResponseRedirect('/new-url/')
如果不想硬编码URL地址,则可以使用reverse()函数来生成URL,它接受一个URL模式名称和一个可选的参数列表,并返回与该模式匹配的URL地址。
from django.urls import reverse
from django.http import HttpResponseRedirect
def my_view(request):
url = reverse('myapp:myview')
return HttpResponseRedirect(url)
可以使用redirect()函数实现重定向。redirect()函数是一个快捷方式,用于创建HttpResponseRedirect对象。
from django.shortcuts import redirect
def 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') # 临时cookie
response.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来设置全局默认值。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/136841.html