在URL中使用os.sep代替"/"可以吗?
看起来 os.sep 返回的是 "/" 这个符号,我在想能不能用它来构造一个网址,比如想得到像 https://some.domain.com/catalogs
这样的链接。
protocol + request.get_host() + os.sep + get_file_name()
- 这样做会有什么问题吗?
或者
- 在 urllib/2 里有没有什么方法可以用来连接网址?
3 个回答
来自文档的内容:
操作系统用来分隔路径名各部分的字符。在POSIX系统中是'/',而在Windows系统中是'\'。需要注意的是,知道这个字符并不足以让你正确处理路径名的解析或连接——应该使用os.path.split()和os.path.join()来处理这些问题——但有时候知道这个字符还是挺有用的。你也可以通过os.path来获取这个信息。
所以,不,这样使用是不安全的。
对于URI的解析、分割、连接等操作,你应该使用urllib.parse库。(在Python 2中叫做urlparse)
在Windows系统上,os.sep会返回\
这个符号。你是否需要这个符号,主要取决于你使用的协议。一般来说,如果你处理的不是file://
这种格式的URL,使用os.sep就不太合适了(即使是这种情况,也有点值得怀疑)。
你可能会觉得urlparse
这个工具很有用:https://docs.python.org/2/library/urlparse.html
os.sep
是用来获取你当前系统文件路径的分隔符。你的系统路径和URI路径是不一样的。
RFC 3986 里说:
一个路径由一系列用斜杠("/")分开的路径段组成。
如果你有一个像 http://foo.bar.baz/a/b/c/d
这样的URI,你应该使用 urlsplit
来把它拆分成不同的部分,并提取出 path
部分。然后你可以安全地使用 .split('/')
来获取这个路径的每个部分,或者用 '/'.join
来根据这些部分重新构建一个路径(前提是你知道每个部分都是有效的)。
这里的语法规定,/
只能作为路径段的分隔符,想要确认的话可以查一下RFC。不过,这个规则不适用于整个URL,/
在其他URL部分可能有不同的意思。
urlsplit
的反向操作是 urlunsplit
,当你把路径组装好后,它可以帮你完成想要的操作。
为了安全起见,在用 /
连接各个路径部分之前,你应该先对它们进行百分号编码,使用 urllib.quote('/test', '')
(注意第二个参数 - 这里 /
默认是不被转义的)。