/ / Python-Flaschenarray-Abfragezeichenfolge in url_for-python, flask

Python-Kolben-Array-Abfragezeichenfolge in url_for-python, flask

Ich kann keine Informationen über das Generieren einer URL mithilfe von Array-Querystrings finden, wie z. http://www.domain.com?page[limit]=20&page[offset]=0

Ich habe es versucht:

url_for(endpoint, page={"limit": 0, "offset": 0}, _external=True)

Es wurde jedoch die folgende URL generiert:

http://www.domain.com?page={"limit": 0, "offset": 0}

Meine derzeitige Lösung ist wie folgt:

querystrings = []
querystrings.append("page[limit]=%d" % (limit))
querystrings.append("page[offset]=%d" % (offset))
url = "%s?%s" % (root_url, "&".join(querystrings))

Ich hoffe wirklich, dass es einen besseren Weg gibt!

Jede Hilfe wäre willkommen!


Bearbeiten

Am Ende habe ich einen Wrapper erstellt, der die Dictes separat behandelt, basierend auf meiner vorherigen Lösung:

from flask import g, url_for as _url_for

def url_for(endpoint, **values):
# fix querystring dicts
querystring_dicts = []
for key, value in list(values.items()):
if isinstance(value, dict):
for _key, _value in list(value.items()):
querystring_dicts.append("%s[%s]=%s" % (key, _key, _value))
values.pop(key)

# create url
url = _url_for(endpoint, **values)

# append querystring dicts
if querystring_dicts:
seperator = "?"
if "?" in url:
seperator = "&"
url = "%s%s%s" % (url, seperator, "&".join(querystring_dicts))

return url

Ich rufe den Wrapper dann so an:

url_for(endpoint, page={"limit": 20, "offset": 0}, _external=True)

Und es wird folgende URL zurückgegeben:

http://www.domain.com?page[limit]=20&page[offset]=0

Antworten:

3 für die Antwort № 1

Ich glaube nicht, dass das, was Sie versuchen, aus der Box unterstützt wird. Unter der Haube url_for verlässt sich auf URL-Routing-Konverter von Werkzeug diese Werte zu generieren und zu kodieren, und es scheint kein Encoder für Wörterbücher zu sein (nebenbei gesagt, das ist es, was das ist) {key: value} Syntax bedeutet, es ist kein Array).

ich fand dieser Klappentext was beschreibt die Implementierung von CustomKonverter, wenn Sie selbst Support hinzufügen möchten. Das Flask-Projekt kann sogar froh sein, PR zu bekommen, wenn Sie diesen Weg gehen, es sei denn, Sie benötigen etwas page[limit] eher, als page_limit Ich würde sie einfach ändern.

url_for(endpoint, page_offset = 0, page_limit=0, _external=True)