在Python应用程序中,无法找到项目的来源

时间:2016-10-12 13:52:41

标签: python web2py

我试图理解框架 web2py 的工作原理,request.client中有一个名为access.py的项目我无法理解它来自哪里。我从here检索了代码,它开始如下:

import base64
import os
import time
from gluon.admin import apath
from gluon.fileutils import read_file
from gluon.utils import web2py_uuid
from pydal.contrib import portalocker
# ###########################################################
# ## make sure administrator is on localhost or https
# ###########################################################


http_host = request.env.http_host.split(':')[0]

我的问题是:当我们不知道代码中某个项目的来源时,找到它的方法是什么?

3 个答案:

答案 0 :(得分:2)

您链接的文件access.py在第13行首次提到名称request

http_host = request.env.http_host.split(':')[0]

此符号request不是import来自任何地方。这是一种非正统的编写Python程序的方法,而且它看起来是不可能的。但如果符号request被包含access.py执行的其他文件添加到此文件的全局工作空间,则 可能。这是一个最小的例子:

d = { 'request' : some_object() }
execfile( 'access.py', d )  # run the named file using d as its global workspace

因此,在这种特殊情况下,调查的方法是找到执行access.py的文件。

[回应你关于检查库中每个文件的评论:对于这样的分析,以及作为程序员提高生活质量的一般情况, 需要一些可以搜索的工具对于整个文件层次结构中的特定字符串(如Linux和MacOS上的命令行工具grep,或者Windows上的许多第三方文本编辑器和IDE,但 永远不可靠的Windows“搜索”功能,声称能够做到这一点)。 ]

回答有关查找事物来源的更一般性问题:其他答案和评论提及__file__和/或__module__等属性。如果您有一种方法可以使代码吐出调试信息,这些可以提供帮助。由于您正在使用非控制台(Web)框架,这可能并非易事,但一种快速而肮脏的方式可能是在access.py中插入这样的行:

open('some_temporary_file_somewhere.txt', 'wt').write('\n'.join([
    repr( request ),
    request.__module__,
    request.__class__,
])

这可以让您了解定义request类的位置的详细信息(但不一定是创建名为request的实际实例的文件的名称。)

答案 1 :(得分:2)

正如here所述,web2py模型,控制器和视图文件由框架在已填充核心API对象的环境中执行,包括requestresponsesessioncacheDALField,HTML帮助程序和表单验证程序(API的其他部分,如Auth,Mail,Services,Scheduler等)工具和贡献的库包含在模块中并像往常一样导入。)

具体来说,request对象在gluon.main.wsgibase的主WSGI应用程序(this line)内创建(在每次请求时),随后传递给gluon.main.serve_controller at this lineserve_controller函数将request对象添加到执行环境,然后在该环境中执行模型,控制器和视图文件。

除了模型,控制器和视图文件之外,您的应用程序还可以包含自己的模块。应用程序中的模块不由框架执行(必须导入) - 因此,这些模块必须通过从gluon导入来访问web2py核心API对象(依赖于请求的对象,例如requestresponse一样,可以通过current线程局部对象访问,如here所述。)

查看文档的WorkflowLibrariesExecution environment部分可能也会有所帮助。

答案 2 :(得分:0)

在尝试弄清楚如何将项目导入Python时,您需要查看感兴趣的文件中的显式import语句。在编写良好的代码中,这将是显而易见的。

如果将感兴趣的对象导入到python shell中,则可以使用.__file__属性来查找从该对象导入的字节码文件。您可能会发现其他有用的属性,例如

.__name__
.__path__
.__package__

如果你使用强烈推荐的IPython,你可以通过输入<obj>.__并点击标签轻松获得这些双下划线方法的列表。

查看您关联的文件,我不确定导入request的位置。但是,clientrequest对象的一个​​属性。