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 }}!
在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路径(包括查询字符串)
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')
HttpRequest对象的属性GET、POST都是QueryDict类型的对象,QueryDict类型的对象用来处理同一个键带有多个值的情况
get()方法:
根据键获取值,如果一个键同时拥有多个值将获取最后一个值。如果键不存在则返回None值,可以设置默认值进行后续处理
get('键',默认值)
getlist()方法:
根据键获取值,值以列表返回,可以获取指定键的所有值。如果键不存在则返回空列表[],可以设置默认值进行后续处理
getlist('键',默认值)
获取请求路径中的查询字符串参数,如:
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
在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)
通过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对象来创建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')
通过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
通过HttpResponse对象的COOKIES属性来读取本次请求携带的cookie值。request.COOKIES为字典类型。
def userList(request):cookie = request.COOKIES.get('token2')print(cookie )return HttpResponse('ok')
通过HttpResponse对象中的delete_cookie方法来删除。
def userList(request):response.delete_cookie('token2')return HttpResponse('ok')
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'
通过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来设置全局默认值。
上一篇:零基础能学大数据吗?