我试图理解框架 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]
我的问题是:当我们不知道代码中某个项目的来源时,找到它的方法是什么?
答案 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对象的环境中执行,包括request
,response
,session
,cache
,DAL
,Field
,HTML帮助程序和表单验证程序(API的其他部分,如Auth,Mail,Services,Scheduler等)工具和贡献的库包含在模块中并像往常一样导入。)
具体来说,request
对象在gluon.main.wsgibase的主WSGI应用程序(this line)内创建(在每次请求时),随后传递给gluon.main.serve_controller at this line。 serve_controller
函数将request
对象添加到执行环境,然后在该环境中执行模型,控制器和视图文件。
除了模型,控制器和视图文件之外,您的应用程序还可以包含自己的模块。应用程序中的模块不由框架执行(必须导入) - 因此,这些模块必须通过从gluon
导入来访问web2py核心API对象(依赖于请求的对象,例如request
和response
一样,可以通过current
线程局部对象访问,如here所述。)
查看文档的Workflow,Libraries和Execution environment部分可能也会有所帮助。
答案 2 :(得分:0)
在尝试弄清楚如何将项目导入Python时,您需要查看感兴趣的文件中的显式import
语句。在编写良好的代码中,这将是显而易见的。
如果将感兴趣的对象导入到python shell中,则可以使用.__file__
属性来查找从该对象导入的字节码文件。您可能会发现其他有用的属性,例如
.__name__
.__path__
.__package__
如果你使用强烈推荐的IPython,你可以通过输入<obj>.__
并点击标签轻松获得这些双下划线方法的列表。
查看您关联的文件,我不确定导入request
的位置。但是,client
是request
对象的一个属性。