"def post"和"if.request.method == POST "是一样的吗?



def postif.request.method == POST一样吗?

我看到有些人使用def post(self, request),有些人使用if.request.method == 'POST'.它们似乎都有效,至少对于我见过的任务而言。

有区别吗?

我想你混合了 2 种主要的 Django 方法:基于函数的视图和基于类的视图。
if request.method == POST-
FBV,def post(self, request)- CBV.
在 FBV 中,您通常将视图编写为函数,其中有条件地检查制作的方法。在 CBV 中,你正在覆盖一些 Django 内置类和该类中的内置方法。
是的,这是相同的动作。
对于初学者来说,开始学习基于函数的视图更容易。

我假设你说的是基于类的观点。在这种情况下,如果不更改路由机制,答案是肯定的。

让我们看一下View类 [GitHub] 的源代码。通常基于类的视图从这个类子类,从而继承这个类的行为:

class View:
# ...
http_method_names = ['get', 'post', 'put', 'patch',
'delete', 'head', 'options', 'trace']
# ...
@classonlymethod
def as_view(cls, **initkwargs):
# ...
defview(request, *args, **kwargs):
self = cls(**initkwargs)
if hasattr(self, 'get') and not hasattr(self, 'head'):
self.head = self.get
self.request = request
self.args = args
self.kwargs = kwargs
returnself.dispatch(request, *args, **kwargs)
# ...
return view
defdispatch(self, request, *args, **kwargs):
# ...
if request.method.lower() in self.http_method_names:
handler = getattr(self, request.method.lower(), 
self.http_method_not_allowed)
else:
handler = self.http_method_not_allowed
returnhandler(request, *args, **kwargs)

# ...

我在这里删除了或多或少无关紧要的部分,并稍微修复了格式以使其更方便阅读。

如您所见,如果您调用as_view()函数(当您声明url(..)path(..)时,那么它基本上def view(..)构造一个函数,并且对该函数的引用与此 URL 链接。

现在view(..)函数执行一些操作(例如,如果未实现head (...)函数,它将在稍后回退get (..)函数。然而,最重要的部分是它调用self.dispatch(..)函数。

此调度功能面向request.method。它将此方法转换为小写变体,然后检查是否在视图中声明了该方法。如果是,它会调用相应的方法(所以在request.method == 'POST'的情况下,它会调用带有request*args**kwargspost (...)(,如果缺少该方法,它基本上会返回一个"HTTP 方法不允许的响应"。

但请注意,您可以对as_view进行子类化,并dispatch(..)函数,从而更改此行为。

此外,严格来说,你可以编写自己的View类,当然可以有完全不同的行为,但我认为这不是这个问题的范围。

因此,基于类的视图基本上执行类似的东西(这不是代码的样子,但在语义上它大致相同(:

def some_view(request, *args, **kwargs):
if request.method == 'GET':
return self.get(request, *args, **kwargs)
if request.method == 'POST':
return self.post(request, *args, **kwargs)
if request.method == 'PUT':
return self.put(request, *args, **kwargs)
if request.method == 'PATCH':
return self.patch(request, *args, **kwargs)
if request.method == 'DELETE':
return self.delete(request, *args, **kwargs)
if request.method == 'HEAD':
return self.head(request, *args, **kwargs)
if request.method == 'OPTIONS':
return self.options(request, *args, **kwargs)
if request.method == 'TRACE':
return self.trace(request, *args, **kwargs)
else:
return self.http_method_not_allowed(request, *args, **kwargs)

当然,所有这些函数都存在(情况并非总是如此(。此外,options(..)函数是自动生成的:它检查定义了哪些函数,并返回相应方法的列表。

最新更新