netloc是什么意思?

33

我正在学习使用Flask-login创建登录功能,遇到了我正在跟随的教程中的这段代码:

@app.route('/login', methods = ['GET', 'POST'])
def login():
    if current_user.is_authenticated:
        return redirect(url_for('index'))
    form = LoginForm()
    if form.validate_on_submit():
        user = User.query.filter_by(username=form.username.data).first()
        if user is None or not user.check_password(form.password.data):
            flash('Invalid username or password')
            return redirect(url_for('login'))
        login_user(user, remember=form.remember_me.data)
        next_page = request.args.get('next')
        if not next_page or url_parse(next_page).netloc != '': # what is it means in this line..?
            next_page = url_for('index')
        return redirect(next_page)
    return render_template('login.html', title='Sign In', form=form)

但是我不确定我注释掉的上面那段代码是什么意思...?特别是在netloc这个词中,它是什么..?我知道它代表的是网络位置,但是在那一行中的目的是什么..?


2
虽然你调用的函数来自werkzeug,但你可以在标准库中查找netloc的定义。请参见urllib.parse.urlparse。netloc是服务器的名称(IP地址或主机名)。 - Paul Rooney
2个回答

66
RFC 1808, Section 2.1开始,每个URL都应遵循特定的格式:
<scheme>://<netloc>/<path>;<params>?<query>#<fragment>

让我们从句法上分解这个格式:
- `scheme`:协议名称(通常是http/https)。 - `netloc`:包含网络位置信息,包括域名本身(如果有子域名)、端口号,以及可选的用户名和密码,形式为`username:password`。整体可以是`username:password@example.com:80`的形式。 - `path`:包含有关如何访问指定资源的信息。 - `params`:为路径添加了微调的元素(可选)。 - `query`:在考虑路径时,添加了细粒度的访问方式(可选)。 - `fragment`:包含在路径中访问的资源的一些信息片段(可选)。
让我们举一个非常简单的例子来更清楚地理解上述内容:
https://cat.example/list;meow?breed=siberian#pawsize

在上面的例子中:
- `https` 是方案(URL的第一个元素) - `cat.example` 是网络位置(位于方案和路径之间) - `/list` 是路径(位于网络位置和参数之间) - `meow` 是参数(位于路径和查询之间) - `breed=siberian` 是查询(位于片段和参数之间) - `pawsize` 是片段(URL的最后一个元素)
可以使用Python的`urllib.parse.urlparse`来以编程方式复制这个过程。
>>> import urllib.parse
>>> url ='https://cat.example/list;meow?breed=siberian#pawsize'
>>> urllib.parse.urlparse(url)
ParseResult(scheme='https', netloc='cat.example', path='/list', params='meow', query='breed=siberian', fragment='pawsize')

现在来看你的代码,if语句检查next_page是否存在以及next_page是否具有netloc。在login()函数中,检查.netloc != ''的意思是检查url_parse(next_page)的结果是否是相对URL。相对URL具有路径但没有主机名(因此没有netloc)。

7
在RFC 1808第2.1节中,“net_loc”代表“网络位置”,并表示(可选的)登录信息、主机名和(可选的)端口号。根据RFC 1738第3.1节,它必须采用<user>:<password>@<host>:<port>的格式。这与Python 3的文档中关于urllib.parse.urlparseParseResult.netloc所述的一致。在该login()函数中,检查.netloc != ''意味着它正在检查url_parse(next_page)的结果是否为相对URL。相对URL具有路径但没有主机名(因此没有netloc)。 - cowlinator
有什么想法为什么它被称为netloc吗? - Agent Zebra
@AgentZebra 请看之前的评论,它是“网络位置”的缩写。 - augurar

6
import urllib.parse
url="https://example.com/something?a=1&b=1"
o = urllib.parse.urlsplit(url)
print(o.netloc)

example.com


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接