
需求问题
让我们带着问题来思考并熟悉一下这个类视图。
-
同一个 url
路径能否同时处理get
和post
请求呢?是否可以通过request.method
来判断请求类型,然后拆分出来呢? -
如果采用这种 request.method
的if
判断方式,这样就会导致代码结构不清晰,可以怎么做呢?
下面来构建一下这个场景。
构建一个url路径同时处理get和post请求
1) 首先在应用的view.py
中创建两个视图test_method
和test_method_handle
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路径
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
<!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
方法为类方法。
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
的路径配置
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类视图源码

http_method_names = ['get', 'post', 'put', 'patch', 'delete', 'head', 'options', 'trace']
从源码来看,继承View
类不单单可以处理get
和post
方法,还可以处理其他类型的请求。
原文始发于微信公众号(海洋的渔夫):35. Django 2.1.7 类视图
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/31353.html