检索请求对象的源代码

时间:2018-06-04 11:18:10

标签: python django

为了好奇,我通过添加print语句在CBV中进行测试:

def post(self, request, block_id):
    sf = inspect.getsourcefile(request)
    code = inspect.getsouce(request)

然而,我收到了错误:

 TypeError: <WSGIRequest: POST '/article/create/1'> is not a module, class, method, function, traceback, frame, or code object.

Request是一个对象,但它提示没有模块,类,方法,函数,回溯,框架或代码对象。

这是怎么发生的?

1 个答案:

答案 0 :(得分:1)

非常简单:inspect.getsource()inspect.getsourcefile()检查他们的第一个参数的类型并提出TypeError如果它既不是模块(module类的实例),也是类( type类的实例),方法(instancemethod类型的实例),函数(function类的实例),traceback(traceback类型的实例),等等...... FWIW明确记录了这些限制:

>>> import inspect
>>> help(inspect.getsource)

Help on function getsource in module inspect:

getsource(object)
    Return the text of the source code for an object.

    The argument may be a module, class, method, function, traceback, frame,
    or code object.  The source code is returned as a single string.  An
    IOError is raised if the source code cannot be retrieved.

您的request对象不属于这些对象,因此inspect通过引发TypeError来拒绝它,这会产生感觉,因为它只能获取具有源的内容的源代码代码组件。

如果您需要WSGRequest 的源代码,则必须自行传递该类:

def post(self, request, block_id):
    sf = inspect.getsourcefile(type(request))
    code = inspect.getsouce(type(request))