netloc 是啥意思?
Posted
技术标签:
【中文标题】netloc 是啥意思?【英文标题】:What does netloc mean?netloc 是什么意思? 【发布时间】:2019-05-28 07:05:47 【问题描述】:我正在学习使用 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 字中,那是什么..?,我知道那代表 network地点,但那条线的目的是什么..?
【问题讨论】:
虽然你调用的函数来自werkzeug。您可能可以查看标准库以了解 netloc 的定义。见urllib.parse.urlparse。 netloc 是服务器的名称(IP 地址或主机名)。 【参考方案1】:来自RFC 1808, Section 2.1
,每个网址都应遵循特定格式:
<scheme>://<netloc>/<path>;<params>?<query>#<fragment>
让我们从语法上分解这种格式:
scheme
:协议名,一般是http/https
netloc
:包含 network location - 包括域本身(和子域,如果存在)、端口号以及@形式的可选凭据987654327@。一起可以采用username:password@domain.com:80
的形式。
path
:包含有关如何访问指定资源的信息。
params
:向路径添加微调的元素。 (可选)
query
:另一个考虑添加对路径的细粒度访问的元素。 (可选)
fragment
:包含路径内正在访问的资源的信息位。 (可选)
让我们举一个非常简单的例子来清楚地理解上面的内容:
https://cat.com/list;meow?breed=siberian#pawsize
在上面的例子中:
https
是方案(URL 的第一个元素)
cat.com
是 netloc(位于方案和路径之间)
/list
是路径(在 netloc 和 params 之间)
meow
是参数(位于路径和查询之间)
breed=siberian
是查询(在片段和参数之间)
pawsize
是片段(URL 的最后一个元素)
这可以使用 Python 的urllib.parse.urlparse
以编程方式复制:
>>> import urllib.parse
>>> url ='https://cat.com/list;meow?breed=siberian#pawsize'
>>> urllib.parse.urlparse(url)
ParseResult(scheme='https', netloc='cat.com', path='/list', params='meow', query='breed=siberian', fragment='pawsize')
现在来到你的代码,if
语句检查next_page
是否存在以及next_page
是否有一个netloc。在那个login()
函数中,检查.netloc != ''
是否意味着它正在检查url_parse(next_page)
的结果是否是一个相对url。相对 url 有路径但没有主机名(因此没有netloc
)。 ;)
【讨论】:
在 RFC 1808 第 2.1 节中,net_loc
代表 network location
,代表:(可选)登录信息、主机名和(可选)端口号。根据 RFC 1738 第 3.1 节,这必须采用 <user>:<password>@<host>:<port>
的形式。这与 Python 3 在urllib.parse.urlparse
的ParseResult.netloc
上的文档状态一致。在那个login()
函数中,检查.netloc != ''
是否意味着它正在检查url_parse(next_page)
的结果是否是一个相对url。相对 url 有路径但没有主机名(因此没有 netloc
)
知道为什么它被称为 netloc 吗?
@AgentZebra 查看之前的评论,它是 network location 的缩写【参考方案2】:
import urllib.parse
url="https://google.com/something?a=1&b=1"
o = urllib.parse.urlsplit(url)
print(o.netloc)
google.com
【讨论】:
以上是关于netloc 是啥意思?的主要内容,如果未能解决你的问题,请参考以下文章