前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >35. Django 2.1.7 类视图

35. Django 2.1.7 类视图

作者头像
Devops海洋的渔夫
发布2022-01-17 09:45:40
2720
发布2022-01-17 09:45:40
举报
文章被收录于专栏:Devops专栏Devops专栏

需求问题

让我们带着问题来思考并熟悉一下这个类视图。

  • 同一个url路径能否同时处理getpost请求呢?是否可以通过request.method来判断请求类型,然后拆分出来呢?
  • 如果采用这种request.methodif判断方式,这样就会导致代码结构不清晰,可以怎么做呢?

下面来构建一下这个场景。

构建一个url路径同时处理get和post请求

1) 首先在应用的view.py中创建两个视图test_methodtest_method_handle

代码语言:javascript
复制
def test_method(request):
    return render(request,'assetinfo/test_method.html')

def test_method_handle(request):
    if request.method == 'GET':
        return HttpResponse("this is get request!")
    if request.method == 'POST':
        return HttpResponse("this is post request!")

2)配置urls路径

代码语言:javascript
复制
from django.urls import path, re_path
from . import views

app_name = 'assetinfo'# 设置命名空间

urlpatterns = [
    # ex:/assetinfo/test_method
    path('test_method', views.test_method, name='test_method'),
    # ex:/assetinfo/test_method_handle
    path('test_method_handle', views.test_method_handle, name='test_method_handle'),
]

3)在templates创建模板test_method.html

代码语言:javascript
复制
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    <form action="{% url 'assetinfo:test_method_handle' %}" method="post">
        {% csrf_token %}
        <input type="submit" value="提交post请求">
    </form>
</body>
</html>

4)首页直接发送一个get请求,来测试test_method_handle处理get方法,如下:

5)通过访问test_method.html来发送一个post请求,测试test_method_handle处理post方法

发送post请求,如下:

从上面的测试结果来看,http://127.0.0.1:8000/assetinfo/test_method_handle可以同时处理get和post请求了。

这是采用if判断的方法。这样的写法结构比较麻烦,下面来改写使用类视图的方式来处理。

改为类视图

1) 修改test_method_handle方法为类方法。

代码语言:javascript
复制
from django.views.generic import View

class TestMethodHandle(View):

    def get(self, request):
        return HttpResponse("this is get request!")

    def post(self, request):
        return HttpResponse("this is post request!")

2) 修改urls.py的路径配置

代码语言:javascript
复制
from . import views
from .views import TestMethodHandle

urlpatterns = [
    # ex:/assetinfo/test_method_handle
    path('test_method_handle', TestMethodHandle.as_view() , name='test_method_handle'),

3) 测试发送get请求,如下:

4) 测试发送post请求,如下:

发送post请求如下:

可以从结果来看到,导入from django.views.generic import View的类视图之后,就可以直接编写不同的方法来处理不同的业务。

查看View类视图源码

代码语言:javascript
复制
http_method_names = ['get', 'post', 'put', 'patch', 'delete', 'head', 'options', 'trace']

从源码来看,继承View类不单单可以处理getpost方法,还可以处理其他类型的请求。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2021-02-16,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 海洋的渔夫 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 需求问题
  • 构建一个url路径同时处理get和post请求
  • 改为类视图
  • 查看View类视图源码
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档