首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >导入werkzeug VS从werkzeug导入安全性

导入werkzeug VS从werkzeug导入安全性
EN

Stack Overflow用户
提问于 2017-12-07 06:31:37
回答 2查看 3.6K关注 0票数 2

我目前的理解(基于以下答案:Python文档)是如何在Python中导入的(以防万一:所有的代码片段都是在Python3.6.1上测试的)

假设我们有一个模块mod,它有子模块subsub1sub反过来有一个函数func;那么我们可以(当然,考虑到安装在当前环境中的mod ):

代码语言:javascript
复制
import mod

mod.sub.func()
mod.sub1

# or
import mod.sub

mod.sub.func()
mod.sub1 # will result in "NameError: name 'mod' is not defined"

# or
from mod.sub import func

func()
mod.sub.func() # will result in "NameError: name 'mod' is not defined"
mod.sub1 # will result in "NameError: name 'mod' is not defined"

最近,在Python中使用werkzeug.security.generate_password_hashwerkzeug.security.check_password_hash时,我注意到:

代码语言:javascript
复制
import werkzeug

werkzeug.security.generate_password_hash('some_password', method='pbkdf2:sha512', salt_length=25)

AttributeError: module 'werkzeug' has no attribute 'security'检查结果。

尽管如此,下列功能仍然有效:

代码语言:javascript
复制
from werkzeug import security

security.generate_password_hash('some_password', method='pbkdf2:sha512', salt_length=25)

当然,这也是:

代码语言:javascript
复制
import werkzeug.security

werkzeug.security.generate_password_hash('some_password', method='pbkdf2:sha512', salt_length=25)

此外,还有:

代码语言:javascript
复制
from werkzeug.security import generate_password_hash

generate_password_hash('some_password', method='pbkdf2:sha512', salt_length=25)

而且,有一点令人惊讶(至少对我来说),这个:

代码语言:javascript
复制
import werkzeug
from werkzeug import security

werkzeug.security.generate_password_hash('some_password', method='pbkdf2:sha512', salt_length=25)

我的问题是:

  1. 关于import在Python中的工作方式,我的一些想法是错误的(或缺乏细节)吗?
  2. 为什么import werkzeug不允许我访问werkzeug.security?我的理解是-它应该导入werkzeug,以及它的所有子模块/属性。
  3. 为什么import werkzeug + from werkzeug import security允许访问werkzeug.security?我的理解是:它应该将绑定两个单独的名称(它们之间没有连接),如下所示:werkzeugimport werkzeug (即werkzeug模块)和securityfrom werkzeug import security (即werkzeug模块的security子模块)。
EN

回答 2

Stack Overflow用户

发布于 2018-01-08 08:55:03

TL;DR:从werkzeug直接导入包含在字典中的任何属性,即from werkzeug import generate_password_hash

托马斯的回答的启发下,我将尝试总结我自己问题的答案:

  1. 关于import在Python中的工作方式,我的一些想法是错误的(或缺乏细节)吗?

从我目前的立场来看,简短的回答是否定的。不过,最好记住,导入规则/机制可以通过__init__.py在包级别进行定制。

关于主题的进一步阅读:Python导入系统,官方importlib导入Python模块文章。

  1. 为什么import werkzeug不允许我访问werkzeug.security?我的理解是-它应该导入werkzeug,以及它的所有子模块/属性。

正如托马斯·福桑格在他的回答import werkzeug中正确指出的那样,import werkzeug没有从werkzeug模块导入security,因为将作为属性导入的唯一子模块是在__init__.py上定义的子模块(即exceptionsrouting)。这一假设可由以下方面加以证实:

代码语言:javascript
复制
import werkzeug

werkzeug.routing # will return path to routing.py module
werkzeug.exceptions # will return path to exceptions.py module

werkzeug.security # AttributeError: module 'werkzeug' has no attribute 'security'

  1. 为什么import werkzeug + from werkzeug import security允许访问werkzeug.security?我的理解是:它应该将绑定两个单独的名称(它们之间没有连接),如下所示:werkzeugimport werkzeug (即werkzeug模块)和securityfrom werkzeug import security (即werkzeug模块的security子模块)。

这是个棘手的问题。正如Werkzeug的__init__.py中所指出的,函数

展示我们想要展示的东西。

这可能是为什么:

代码语言:javascript
复制
import werkzeug

dir1 = dir(werkzeug)
werkzeug.security # AttributeError: module 'werkzeug' has no attribute 'security'

from werkzeug import security

dir2 = dir(werkzeug)
werkzeug.security # will return path to security.py module
# BUT!
dir1 == dir2 # True

我想,托马斯也在这里,而且:

.__getattr__()方法将返回显式导入的模块。

结论(或我学到的=):

__init__.py所述

..。 Werkzeug提供的大多数函数和类都在HTTP和WSGI层上工作。这些程序没有有用的分组,这就是为什么它们都可以从" werkzeug“中导入,而不是在从文件中导入时替换延迟加载模块的implemented....The实现的模块。然后,对werkzeug模块的属性访问将延迟地从实现对象的模块中导入。

这意味着,而不是:

代码语言:javascript
复制
from werkzeug import security
security.generate_password_hash('some_password', method='pbkdf2:sha512', salt_length=25)
# OR
import werkzeug.security
werkzeug.security.generate_password_hash('some_password', method='pbkdf2:sha512', salt_length=25)
# OR
from werkzeug.security import generate_password_hash
generate_password_hash('some_password', method='pbkdf2:sha512', salt_length=25)
# OR
import werkzeug
from werkzeug import security
werkzeug.security.generate_password_hash('some_password', method='pbkdf2:sha512', salt_length=25)

你可以简单地做:

代码语言:javascript
复制
from werkzeug import generate_password_hash
generate_password_hash('some_password', method='pbkdf2:sha512', salt_length=25)

您可以以同样的方式导入和使用字典中包含的任何属性。

票数 1
EN

Stack Overflow用户

发布于 2020-02-04 08:51:58

如果您遵循这个语法,它就会正常工作。

代码语言:javascript
复制
import werkzeug as xyz

这样,您还可以执行xyz.generate_hash_password()或调用xyz的任何其他函数。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47688957

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档