С учетом URL-адреса, подобного приведенному ниже, как я могу проанализировать значение параметров запроса? Например, в этом случае я хочу значение def
.
/abc?def='ghi'
Я использую Django в своей среде; есть метод объекта request
, который мог бы мне помочь?
Я попытался использовать self.request.get('def')
, но он не возвращает значение ghi
, как я и надеялся.
Python 2:
import urlparse
url = 'http://foo.appspot.com/abc?def=ghi'
parsed = urlparse.urlparse(url)
print urlparse.parse_qs(parsed.query)['def']
Python 3:
import urllib.parse as urlparse
url = 'http://foo.appspot.com/abc?def=ghi'
parsed = urlparse.urlparse(url)
print(urlparse.parse_qs(parsed.query)['def'])
import urllib.parse as urlparse
parse_qs
вернет вам объект списка. Вам нужно получить первый элемент этого, если вы хотите строку urlparse.parse_qs(parsed.query)['def'][0]
import urlparse
url = 'http://example.com/?q=abc&p=123'
par = urlparse.parse_qs(urlparse.urlparse(url).query)
print par['q'][0], par['p'][0]
Я в шоке, это решение не здесь уже. Использование:
request.GET.get('variable_name')
Это "получит" переменную из словаря "GET" и вернет значение "variable_name", если оно существует, или объект None, если он не существует.
self
, но я согласен с приведенным выше комментарием.
для Python> 3.4
from urllib import parse
url = 'http://foo.appspot.com/abc?def=ghi'
query_def=parse.parse_qs(parse.urlparse(url).query)['def'][0]
Я знаю, что это немного поздно, но так как я нашел себя здесь сегодня, я подумал, что это может быть полезным ответом для других.
import urlparse
url = 'http://example.com/?q=abc&p=123'
parsed = urlparse.urlparse(url)
params = urlparse.parse_qsl(parsed.query)
for x,y in params:
print "Parameter = "+x,"Value = "+y
С parse_qsl(), "Данные возвращаются как список пар имен, значений".
Появилась новая библиотека под названием furl. Я считаю, что эта библиотека является наиболее pythonic для выполнения алгебры url. Чтобы установить:
pip install furl
код:
from furl import furl
f = furl("/abc?def='ghi'")
print f.args['def']
URL, на который вы ссылаетесь, является типом запроса, и я вижу, что объект запроса поддерживает метод с именем arguments, чтобы получить аргументы запроса. Вы также можете попробовать self.request.get('def')
напрямую, чтобы получить значение от объекта.
В чистом Python:
def get_param_from_url(url, param_name):
return [i.split("=")[-1] for i in url.split("?", 1)[-1].split("&") if i.startswith(param_name + "=")][0]
Не нужно ничего делать. Только с
self.request.get('variable_name')
Обратите внимание, что я не указываю метод (GET, POST и т.д.). Это хорошо документировано и это пример
Тот факт, что вы используете шаблоны Django, не означает, что обработчик также обрабатывается Django
def getParams(url):
params = url.split("?")[1]
params = params.split('=')
pairs = zip(params[0::2], params[1::2])
answer = dict((k,v) for k,v in pairs)
Надеюсь, что это поможет
Модуль urlparse предоставляет все необходимое:
urlparse.parse_qs()
import cgitb
cgitb.enable()
import cgi
print "Content-Type: text/plain;charset=utf-8"
print
form = cgi.FieldStorage()
i = int(form.getvalue('a'))+int(form.getvalue('b'))
print i
Есть хорошая библиотека w3lib.url
from w3lib.url import url_query_parameter
url = "/abc?def=ghi"
print url_query_parameter(url, 'def')
ghi
Btw, у меня возникли проблемы с использованием parse_qs() и получения параметров пустого значения, и вы узнали, что вам нужно передать второй необязательный параметр 'keep_blank_values', чтобы вернуть список параметров в строке запроса, которая не содержит значений. По умолчанию используется значение false. Некоторые дрянные письменные API-интерфейсы требуют наличия параметров, даже если они не содержат значений
for k,v in urlparse.parse_qs(p.query, True).items():
print k