探究DjangoFBV视图
视图(Views)是Django的MTV架构模式的V部分。可以理解为视图是MVC架构里面的C部分(控制器),主要处理功能和事业上的逻辑。在视图里定义def函数,这种方式称为FBV。
1.设置响应方式
网站的运行原理都是遵从HTTP协议的,分为HTTP请求和HTTP响应。HTTP响应方式也成为HTTP状态码,分为5种状态:消息、成功、重定向、请求错误和服务器错误。若以使用频率划分,则HTTP状态码可以分为:成功、重定向和异常响应(请求错误和服务器错误)。
1.1返回响应内容
视图函数通过return方式返回响应的内容,然后将生成相应的网页内容呈现在浏览器上。
不同的响应方式:
这些方式各代表不同的状态码,其核心作用是Web Server服务器用来告诉浏览器当前网页请求发生了什么事,或者当前Web服务器的响应状态。
以HttpResponse为例:
#index中的urls.py
from django.urls import path
from . import views
urlpatterns = [
path('',views.index,name='index'),
]
#index的views.py
from django.http import HttpResponse
def index(request):
html = 'h=<h1>Hello World</h1>'
return HttpResponse(html,status=200)
从HttpResponse的参数可知,第一个参数是响应内容,一般是网页内容或者JSON数据,分别代表HTML语言,API接口数据。
但如果网页内容过大,肯定会增加视图函数代码量,无法体现模板的作用。因此Django做了封装处理,定义了render、render_to_response和redirect其中render与render_to_response作用一致,所以暂时只讲解render。
render中两个必须的参数request和template_name以及一个重要参数context。
- request:浏览器向服务器发送的请求对象,包含用户信息、请求内容和请求方式等。
- template_name:设置模板文件名,用于生成网页内容。
- context:对模板的模板变量赋值,以字典格式表示,默认情况下是一个空字典。
注:传递模板变量值时,可以选择此方式:使用python内置函数locals()将视图函数内定义的变量直接传递给context即可减少代码冗余。
1.2设置重定向
简单来说,重定向就是跳转到新的网页。
Django中重定向函数:redirect()
此函数是将HttpResponseRedirect和HttpResponsePermanentRedirect的功能进行完善与组合。
urls.py:
from django.urls import path
from . import views
urlpatterns = [
# 定义首页的路由
path('index', views.index, name='index'),
# 定义商城的路由
path('shop', views.shop, name='shop')
]
views.py:
from django.http import HttpResponseRedirect
from django.http import HttpResponsePermanentRedirect
from django.shortcuts import reverse
from django.shortcuts import render, redirect
def index(request):
return redirect('index:shop' ,permanent=False)
# 设置302的重定向
# url = reverse('index:shop')
# return HttpResponseRedirect(url)
# 设置301的重定向
# return HttpResponsePermanentRedirect(url)
def shop(request):
return render(request, 'index.html')
index的响应函数redirect将参数permanent设置为True,并跳转到路由命名未shop的网页;若使用HttpResponseRedirect或者HttpResponsePermanentRedirect,则需使用reverse函数将路由命名转换成路由地址,总结以上,redirect更加便捷。
2.HTTP请求
2.1获取请求信息
当在浏览器上访问某个网址时,实质是向网站发送一个HTTP请求,HTTP请求分为8种请求方式:
- GET:用于获取某个资源的信息,通常用户通过浏览器访问 Web 页面时使用该方法,GET 请求是一种安全的只读请求,不会改变服务器上的资源状态。
- POST:用于在服务器上新建资源或提交数据(如 Web 表单),POST 常被用于提交表单和上传文件等操作,此请求具有修改资源信息的目的。
- PUT:用于在服务器上创建或更新资源,PUT 用于替换指定 URI(Uniform Resource Identifier)下的全部资源,是一种幂等性请求方式。
- DELETE:用于删除服务器上的某个资源。
- HEAD:与 GET 请求方式类似,但只返回请求头部信息,不返回资源内容,该请求用于获取服务器资源的元数据。
- OPTIONS:用于获取 Web 服务器支持的所有 HTTP 方法。
- TRACE:用于追踪当前 HTTP 请求/响应在 Web 服务器之间传递时对应的请求和响应行。
- CONNECT:建立一条到由目标资源标识符所标识的服务器的指定端口的隧道,用于隧道中的数据传输。
以上最基本的是GET请求和POST请求,GET一般用于url请求(参数形式:url?x1=xxx&x2=xxx),POST一般用于表单请求。
对于Django来说,当它接收到HTTP请求之后,会根据HTTP请求携带的请求参数以及请求信息创建一个WSGIRequest对象,并且作为视图函数的第一个参数,这个参数通常写成request,包含用户所有的请求信息,WSGIRequest对象的所有属性:
- WSGIRequest.method:获取客户端请求使用的 HTTP 方法
- WSGIRequest.path:获取用户请求的资源路径
- WSGIRequest.GET:获取 GET 请求中的参数
- WSGIRequest.POST:获取 POST 请求中的参数
- WSGIRequest.COOKIES:获取客户端请求中的 cookie
- WSGIRequest.FILES:获取客户端请求中上传的文件
- WSGIRequest.META:获取服务器和客户端交互的元数据,比如请求头、请求 IP 等
- WSGIRequest.resolver_match:获取与请求路径匹配的 URL 模式匹配项
- WSGIRequest.session:获取客户端请求对应的 session 对象
由于WSGIRequest是继承HttpRequest类,所以也使用其中的类方法,HttpRequest的类有30个左右就不一一详解了。
urls.py:
from django.urls import path
from . import views
urlpatterns = [
# 定义首页的路由
path('', views.index, name='index'),
]
views.py:
from django.shortcuts import render
def index(request):
# 使用method属性判断请求方式
if request.method == 'GET':
# 类方法的使用
print(request.is_secure())
print(request.is_ajax())
print(request.get_host())
print(request.get_full_path())
print(request.get_raw_uri())
# 属性的使用
print(request.COOKIES)
print(request.content_type)
print(request.content_params)
print(request.scheme)
# 获取GET请求的请求参数
print(request.GET.get('user', ''))
return render(request, 'index.html')
elif request.method == 'POST':
# 获取POST请求的请求参数
print(request.POST.get('user', ''))
return render(request, 'index.html')
template模板文件:
<!DOCTYPE html>
<html>
<body>
<h3>Hello world</h3>
<form action="" method="POST">
{% csrf_token %}
<input type="text" name="user"/>
<input type="submit" value="提交"/>
</form>
</body>
</html>