Tại sao
Tôi không hài lòng với tất cả các giải pháp trên trang này (thôi nào , thứ sao chép-dán yêu thích của chúng tôi là ở đâu? ) Vì vậy tôi đã viết bài của riêng mình dựa trên các câu trả lời ở đây. Nó cố gắng hoàn thiện và nhiều Pythonic hơn. Tôi đã thêm một trình xử lý cho các giá trị dict và bool trong các đối số để thân thiện hơn với phía người tiêu dùng ( JS ), nhưng chúng vẫn là tùy chọn, bạn có thể bỏ chúng.
Làm thế nào nó hoạt động
Kiểm tra 1: Thêm đối số mới, xử lý các giá trị Mảng và Bool:
url = 'http://stackoverflow.com/test'
new_params = {'answers': False, 'data': ['some','values']}
add_url_params(url, new_params) == \
'http://stackoverflow.com/test?data=some&data=values&answers=false'
Kiểm tra 2: Viết lại các args hiện có, xử lý các giá trị DICT:
url = 'http://stackoverflow.com/test/?question=false'
new_params = {'question': {'__X__':'__Y__'}}
add_url_params(url, new_params) == \
'http://stackoverflow.com/test/?question=%7B%22__X__%22%3A+%22__Y__%22%7D'
Nói chuyện là rẻ. Cho tôi xem mã.
Mã chính nó. Tôi đã cố gắng mô tả chi tiết về nó:
from json import dumps
try:
from urllib import urlencode, unquote
from urlparse import urlparse, parse_qsl, ParseResult
except ImportError:
# Python 3 fallback
from urllib.parse import (
urlencode, unquote, urlparse, parse_qsl, ParseResult
)
def add_url_params(url, params):
""" Add GET params to provided URL being aware of existing.
:param url: string of target URL
:param params: dict containing requested params to be added
:return: string with updated URL
>> url = 'http://stackoverflow.com/test?answers=true'
>> new_params = {'answers': False, 'data': ['some','values']}
>> add_url_params(url, new_params)
'http://stackoverflow.com/test?data=some&data=values&answers=false'
"""
# Unquoting URL first so we don't loose existing args
url = unquote(url)
# Extracting url info
parsed_url = urlparse(url)
# Extracting URL arguments from parsed URL
get_args = parsed_url.query
# Converting URL arguments to dict
parsed_get_args = dict(parse_qsl(get_args))
# Merging URL arguments dict with new params
parsed_get_args.update(params)
# Bool and Dict values should be converted to json-friendly values
# you may throw this part away if you don't like it :)
parsed_get_args.update(
{k: dumps(v) for k, v in parsed_get_args.items()
if isinstance(v, (bool, dict))}
)
# Converting URL argument to proper query string
encoded_get_args = urlencode(parsed_get_args, doseq=True)
# Creating new parsed result object based on provided with new
# URL arguments. Same thing happens inside of urlparse.
new_url = ParseResult(
parsed_url.scheme, parsed_url.netloc, parsed_url.path,
parsed_url.params, encoded_get_args, parsed_url.fragment
).geturl()
return new_url
Xin lưu ý rằng có thể có một số vấn đề, nếu bạn tìm thấy vấn đề, vui lòng cho tôi biết và chúng tôi sẽ cải thiện vấn đề này
urlparse.parse_qs
thay vìparse_qsl
. Cái sau trả về một danh sách trong khi bạn muốn một chính tả. Xem docs.python.org/library/urlparse.html#urlparse.parse_qs .