探究DjangoFBV视图

探究DjangoFBV视图

视图(Views)是Django的MTV架构模式的V部分。可以理解为视图是MVC架构里面的C部分(控制器),主要处理功能和事业上的逻辑。在视图里定义def函数,这种方式称为FBV。

1.设置响应方式

网站的运行原理都是遵从HTTP协议的,分为HTTP请求和HTTP响应。HTTP响应方式也成为HTTP状态码,分为5种状态:消息、成功、重定向、请求错误和服务器错误。若以使用频率划分,则HTTP状态码可以分为:成功、重定向和异常响应(请求错误和服务器错误)。

1.1返回响应内容

视图函数通过return方式返回响应的内容,然后将生成相应的网页内容呈现在浏览器上。

不同的响应方式:

image-20230504232737903

这些方式各代表不同的状态码,其核心作用是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种请求方式:

  1. GET:用于获取某个资源的信息,通常用户通过浏览器访问 Web 页面时使用该方法,GET 请求是一种安全的只读请求,不会改变服务器上的资源状态。
  2. POST:用于在服务器上新建资源或提交数据(如 Web 表单),POST 常被用于提交表单和上传文件等操作,此请求具有修改资源信息的目的。
  3. PUT:用于在服务器上创建或更新资源,PUT 用于替换指定 URI(Uniform Resource Identifier)下的全部资源,是一种幂等性请求方式。
  4. DELETE:用于删除服务器上的某个资源。
  5. HEAD:与 GET 请求方式类似,但只返回请求头部信息,不返回资源内容,该请求用于获取服务器资源的元数据。
  6. OPTIONS:用于获取 Web 服务器支持的所有 HTTP 方法。
  7. TRACE:用于追踪当前 HTTP 请求/响应在 Web 服务器之间传递时对应的请求和响应行。
  8. CONNECT:建立一条到由目标资源标识符所标识的服务器的指定端口的隧道,用于隧道中的数据传输。

以上最基本的是GET请求和POST请求,GET一般用于url请求(参数形式:url?x1=xxx&x2=xxx),POST一般用于表单请求。

对于Django来说,当它接收到HTTP请求之后,会根据HTTP请求携带的请求参数以及请求信息创建一个WSGIRequest对象,并且作为视图函数的第一个参数,这个参数通常写成request,包含用户所有的请求信息,WSGIRequest对象的所有属性:

  1. WSGIRequest.method:获取客户端请求使用的 HTTP 方法
  2. WSGIRequest.path:获取用户请求的资源路径
  3. WSGIRequest.GET:获取 GET 请求中的参数
  4. WSGIRequest.POST:获取 POST 请求中的参数
  5. WSGIRequest.COOKIES:获取客户端请求中的 cookie
  6. WSGIRequest.FILES:获取客户端请求中上传的文件
  7. WSGIRequest.META:获取服务器和客户端交互的元数据,比如请求头、请求 IP 等
  8. WSGIRequest.resolver_match:获取与请求路径匹配的 URL 模式匹配项
  9. 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>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

菜小田

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值