api_view['POST', 'GET'] 违背了坚实的原则?



这不是我面临的问题,这只是一个公开的讨论。在Django Rest框架中,我们声明了一个decorator@api_view[]它的参数是

  1. 文章
  2. 得到
  3. 删除

在我的例子中,我允许在装饰器中放置多个参数并使一个函数具有多个职责,例如

@api_view['POST', 'GET]
def fbv_list(request):`
if request.method == 'POST':
#do something
if request.method == 'GET':
#do something

在这个例子中,fbv_list做了不止一个东西,这是POST得到不是在这种情况下,这个函数是针对单一责任类来自SOLID原理????

这是我的问题,如果是的话,应该怎么做才能避免破坏SOLID。

提前感谢。

我将以引用Django官方文档中视图的定义来开始我的回答:

view函数,简称view,是一个Python函数,它接受AWeb请求并返回Web响应。这个响应可以是HTML网页内容、重定向、404错误或XML文件,或图像…或者任何事情,真的。视图本身包含返回该值所需的任意逻辑响应。

视图的职责是将web请求作为输入,并返回web响应作为输出。DRF api也是"视图",所以这个定义也适用于此。

进一步细分,视图的核心职责是接受请求并执行"任意"操作。这是合乎逻辑的。随意是什么?当视图接收到请求时,它将如何决定执行哪一组操作?请求是否试图从系统获取某些信息、创建记录,或者可能尝试对数据模型进行复杂的更新操作?这是视图必须决定的,因为这是它的主要目的。根据输入请求的性质,输出的类型将发生变化。然而,核心功能仍然是相同的。它不违反SRP。我还列出了Django文档中使用相同模式的代码片段之一:

from django.http import HttpResponseRedirect
from django.shortcuts import render
from .forms import NameForm
def get_name(request):
# if this is a POST request we need to process the form data
if request.method == 'POST':
# create a form instance and populate it with data from the request:
form = NameForm(request.POST)
# check whether it's valid:
if form.is_valid():
# process the data in form.cleaned_data as required
# ...
# redirect to a new URL:
return HttpResponseRedirect('/thanks/')
# if a GET (or any other method) we'll create a blank form
else:
form = NameForm()
return render(request, 'name.html', {'form': form})

注:一定要查看这个链接,看看SRP是如何误导人的,以及它的目的和用途是如何主观的。

在我看来你没有违反任何规则。对于一个函数,您正在处理一个对象。这样做可以节省行数/输入,使以后的阅读和调试变得更容易。如果get处理一个对象而post处理另一个对象,就会违反规则。如果某些东西不工作,那么调试它将是地狱。

(我的观点)。

最新更新