[Flask] URL Map Converters
jnnk
hi at jnnkb.eu
Fri Dec 3 07:54:04 EST 2021
Hey everybody,
I yesterday tried using an IDSlugConverter similar to this <https://stackoverflow.com/questions/27760307/create-a-url-with-an-articles-title> with a current version of Werkzeug, which worked without any problems until 0.16.0. Unfortuantly any version >= 1.0.0 leads to the following error:
File "<werkzeug routing>", line 1, in <builder:'/files/<id_slug:id>'>
File "test_urlmap_converter/flask_app.py", line 20, in to_url
return f"{value.id}/{value.filename}"
AttributeError: 'int' object has no attribute ‚id‘
I create the following minimal example to illustrate the problem. The error occurs when navigating to /files/3/hey.txt.
from flask import Flask, url_for
from werkzeug.routing import BaseConverter
class File:
def __init__(self, id_, filename):
self.id = id_
self.filename = filename
class IDSlugConverter(BaseConverter):
"""Matches an int id and optional slug, separated by "/"."""
regex = r"-?\d+(?:/[\w\-]*.\w*)?"
def to_python(self, value):
return int((value.split("/"))[0])
def to_url(self, value):
return f"{value.id}/{value.filename}"
app = Flask(__name__)
app.url_map.converters["id_slug"] = IDSlugConverter
@app.route("/")
def index():
url = url_for("serve_file", id=File(3, "hey.txt"))
return f'<a href="{url}">Bild</a>'
@app.route("/files/<id_slug:id>")
def serve_file(id):
return "fancy file"
It seems like these converters now require that to_python and to_url are inverses. Is this intended? Since I’m using this with different model classes I otherwise would have to use some magic like below to prevent circular imports. (See attached app.zip)
def __init__(self, url_map, model):
module, variable = model.rsplit(".", 1)
self.model = getattr(sys.modules[module], variable)
super().__init__(url_map)
With kind regards,
jnnk
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://mail.python.org/pipermail/flask/attachments/20211203/3f89f2dc/attachment.html>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: app.zip
Type: application/zip
Size: 10012 bytes
Desc: not available
URL: <https://mail.python.org/pipermail/flask/attachments/20211203/3f89f2dc/attachment.zip>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://mail.python.org/pipermail/flask/attachments/20211203/3f89f2dc/attachment-0001.html>
More information about the Flask
mailing list