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状态码,如200404等。

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来设置全局默认值。

猜你喜欢

转载自blog.csdn.net/qq_38628046/article/details/128210975