Я учусь выполнять функцию входа в систему с помощью Flask-логин, и я столкнулся с этим кодом в моем руководстве, за которым я следую:
@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, что это ..?, Я знаю, что это означает сетевая местность, но какова цель этой строки ..?






Начиная с RFC 1808, Section 2.1, каждый URL-адрес должен иметь определенный формат:
<scheme>://<netloc>/<path>;<params>?<query>#<fragment>
Давайте разберем этот формат синтаксически:
scheme: имя протокола, обычно http / https.netloc: содержит сетьwork местоation, который включает сам домен (и субдомен, если он есть), номер порта, а также дополнительные учетные данные в форме username:password. Вместе они могут принимать форму username:[email protected]: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). ;)
В разделе 2.1 RFC 1808 net_loc означает network location и представляет: (необязательную) информацию для входа, имя хоста и (необязательный) номер порта. Согласно RFC 1738, раздел 3.1, он должен иметь форму <user>:<password>@<host>:<port>. Это согласуется с тем, что говорится в документации Python 3 на urllib.parse.urlparseParseResult.netloc. В этой функции login() проверка наличия .netloc != '' означает, что она проверяет, является ли результат url_parse(next_page) относительным URL-адресом. У относительного URL-адреса есть путь, но нет имени хоста (и, следовательно, нет netloc)
Есть идеи, почему это называется netloc?
@AgentZebra См. Предыдущий комментарий, это сокращение от сетьwork местоation
import urllib.parse
url = "https://google.com/something?a=1&b=1"
o = urllib.parse.urlsplit(url)
print(o.netloc)
google.com
Хотя функция, которую вы вызываете, взята из werkzeug. Возможно, вы можете обратиться к стандартной библиотеке для определения netloc. См. urllib.parse.urlparse. netloc - это имя сервера (IP-адрес или имя хоста).