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:
Antworten:
3 für die Antwort № 1Ich 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)