{"id":446,"date":"2011-08-01T20:13:03","date_gmt":"2011-08-01T19:13:03","guid":{"rendered":"http:\/\/www.streppone.it\/cosimo\/blog\/2011\/08\/using-template-toolkit-with-mojolicious\/"},"modified":"2011-08-01T20:13:03","modified_gmt":"2011-08-01T19:13:03","slug":"using-template-toolkit-with-mojolicious","status":"publish","type":"post","link":"https:\/\/www.streppone.it\/cosimo\/blog\/2011\/08\/using-template-toolkit-with-mojolicious\/","title":{"rendered":"Using Template Toolkit with Mojolicious"},"content":{"rendered":"<p>For an upcoming project, I decided to try and use Mojolicious in production. That would be the first time, so I&#39;m quite excited to see what&#39;s going to happen.<\/p>\n<p>A few days ago I wrote some sample application that just loads a basic <a href=\"http:\/\/www.tt2.org\" rel=\"nofollow\">Template Toolkit<\/a> template and renders it, and benchmarked it using both:<\/p>\n<ul>\n<li>mod_perl and <code>Plack::Handler::Apache2<\/code> and,<\/li>\n<li>using <code>starman<\/code> as self-contained HTTP server running the psgi application<\/li>\n<\/ul>\n<p>I have to say that I was quite impressed with the performance level of <a href=\"http:\/\/metacpan.org\/module\/Starman\" rel=\"nofollow\">Starman<\/a>. I got 1,000+ (a thousand plus) requests per second without the server even breaking a sweat. The command line, just in case, was:<\/p>\n<pre><code>starman --workers 32 .\/app.psgi<\/code><\/pre>\n<p>Anyway, back to using TT. I found myself searching for recipes on how to use TT with Mojolicious because there wasn&#39;t a clear documented answer on how to do it, or at least I didn&#39;t find it. An example of what I came up with follows.<\/p>\n<h3>Step 1: the Mojolicious application class<\/h3>\n<p>First you have to create your application class. You should probably use the script that generate the basic skeleton for you. There&#39;s <a href=\"http:\/\/mojolicio.us\/perldoc\" rel=\"nofollow\">nice documentation<\/a> on how to do that. My class looks like this:<\/p>\n<pre><code>\r\npackage My::PSGI::App;\r\n\r\nuse strict;\r\nuse base &#39;Mojolicious&#39;;\r\nuse Opera::Config;\r\n\r\nsub startup {\r\n    my $self = shift;\r\n    \r\n    $self-&gt;secret(&#39;some-secret-random-string&#39;);\r\n\r\n    # Our internal configuration system\r\n    my $conf = Opera::Config-&gt;new();\r\n    my $tmpl_dir = $conf-&gt;get(&#39;Template:include_dir&#39;);\r\n    my $cache_dir = $conf-&gt;get(&#39;Template:cache_dir&#39;);\r\n\r\n    # Tell Mojolicious we want to load the TT renderer plugin\r\n    $self-&gt;plugin(tt_renderer =&gt; {\r\n        template_options =&gt; {\r\n            # These options are specific to TT\r\n            INCLUDE_PATH =&gt; $tmpl_dir,\r\n            COMPILE_DIR =&gt; $cache_dir,\r\n            COMPILE_EXT =&gt; &#39;.ttc&#39;,\r\n            # ... anything else to be passed on to TT should go here\r\n        },\r\n    });\r\n\r\n    $self-&gt;renderer-&gt;default_handler(&#39;tt&#39;);\r\n\r\n    my $r = $self-&gt;routes;\r\n\r\n    # Your routes should go here\r\n    $r-&gt;route(&#39;\/login&#39;)-&gt;to(&#39;account#login&#39;);\r\n    # ... and so on ...\r\n\r\n}\r\n\r\n1;\r\n<\/code><\/pre>\n<p>To have your TT templates picked up, you only need a few more things.<\/p>\n<h3><code>Mojolicious::Plugin::TtRenderer<\/code><\/h3>\n<p>When you declare that you want to load the <code>tt_renderer<\/code> plugin (see above, <code>$self-&gt;plugin(tt_renderer=&gt;...)<\/code>), then Mojolicious will &quot;camelize&quot; the <code>tt_renderer<\/code> string, turn it into <code>Mojolicious::Plugin::TtRenderer<\/code>, and try to load that plugin, if available.<\/p>\n<p>Turns out there was a <a href=\"https:\/\/metacpan.org\/module\/MojoX::Renderer::TT\" rel=\"nofollow\">MojoX::Renderer::TT<\/a> CPAN module that also contained a class called <code>Mojolicious::Plugin::TtRenderer<\/code>. I said <strong>there was<\/strong> because Sebastian Riedel, the main developer of Mojolicious had in the meantime deprecated the <code>MojoX<\/code> namespace.<\/p>\n<p>Since we&#39;re building the modules we want to use in production as deb packages, we would have run the risk to package <code>MojoX::Renderer::TT<\/code> to have it changed later because of this namespace conflict. To avoid this, I decided to fork <a href=\"http:\/\/github.com\/abh\/mojox-renderer-tt\" rel=\"nofollow\">its repository<\/a> and put together <a href=\"https:\/\/github.com\/cosimo\/mojox-renderer-tt\/tree\/drop-mojox-namespace\" rel=\"nofollow\">a patch to remove the use of the MojoX:: namespace<\/a>. With this, I hoped to get the thing done and hopefully picked up quickly by the maintainer of MojoX::Renderer::TT.<\/p>\n<p>Turned out that he was super responsive (thanks Ask!) to merge the change and release it to CPAN, so ladies and gentlemen, I hereby announce we have <a href=\"http:\/\/metacpan.org\/module\/Mojolicious::Plugin::TtRenderer\" rel=\"nofollow\">Mojolicious::Plugin::TtRenderer<\/a> 1.20+ out!<\/p>\n<p>In fact, the old deprecated MojoX:: module is still there, just don&#39;t use it, and install <a href=\"http:\/\/metacpan.org\/module\/Mojolicious::Plugin::TtRenderer\" rel=\"nofollow\">Mojolicious::Plugin::TtRenderer<\/a> instead.<\/p>\n<h3>Templates naming<\/h3>\n<p>Another thing you need for TT to work out of the box is that your templates should(*) be named <code>sometemplate.html.tt<\/code>. (*) probably you can deviate from this convention, I just don&#39;t know yet.<\/p>\n<h3>Your controller should specify TT as the renderer<\/h3>\n<p><strong>UPDATE: this is not needed<\/strong>. If you&#39;re using:<\/p>\n<pre><code>$self-&gt;renderer-&gt;default_handler(&#39;tt&#39;);<\/code><\/pre>\n<p>in your main application class, then you won&#39;t need to specify format and handler in every controller.<\/p>\n<p>Again, not sure it&#39;s really needed (<strong>no, it&#39;s not, read above<\/strong>), check before you copy\/paste. Here&#39;s a simple action from one of my controllers (following the previous example):<\/p>\n<pre><code>\r\npackage My::PSGI::App::Account;\r\n \r\nuse strict;\r\nuse base &#39;Mojolicious::Controller&#39;;\r\n \r\nsub login {\r\n    my $self = shift;\r\n    \r\n    $self-&gt;render(\r\n        template =&gt; &#39;path\/to\/template&#39;, # *without* .html.tt\r\n        format   =&gt; &#39;html&#39;,\r\n        handler  =&gt; &#39;tt&#39;,\r\n    );\r\n    \r\n}\r\n\r\n1;\r\n\r\n<\/code><\/pre>\n<p>That should be it: have fun! <img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/www.streppone.it\/img\/mypost20110801.gif\" width=\"1\" height=\"1\" \/><\/p>\n<p><strong>EDIT: Thanks Robert for the suggestions<\/strong>.<\/p><\/p>\n","protected":false},"excerpt":{"rendered":"<p>For an upcoming project, I decided to try and use Mojolicious in production. That would be the first time, so I&#39;m quite excited to see what&#39;s going to happen. A few days ago I wrote some sample application that just loads a basic Template Toolkit template and renders it, and benchmarked it using both: mod_perl [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1],"tags":[49,91,63,256,51,292,295,50,293,229,294,281,48],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v22.9 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Using Template Toolkit with Mojolicious - Random hacking<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.streppone.it\/cosimo\/blog\/2011\/08\/using-template-toolkit-with-mojolicious\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Using Template Toolkit with Mojolicious - Random hacking\" \/>\n<meta property=\"og:description\" content=\"For an upcoming project, I decided to try and use Mojolicious in production. That would be the first time, so I&#039;m quite excited to see what&#039;s going to happen. A few days ago I wrote some sample application that just loads a basic Template Toolkit template and renders it, and benchmarked it using both: mod_perl [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.streppone.it\/cosimo\/blog\/2011\/08\/using-template-toolkit-with-mojolicious\/\" \/>\n<meta property=\"og:site_name\" content=\"Random hacking\" \/>\n<meta property=\"article:published_time\" content=\"2011-08-01T19:13:03+00:00\" \/>\n<meta property=\"og:image\" content=\"http:\/\/www.streppone.it\/img\/mypost20110801.gif\" \/>\n<meta name=\"author\" content=\"cosimo\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"cosimo\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"4 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/www.streppone.it\/cosimo\/blog\/2011\/08\/using-template-toolkit-with-mojolicious\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/www.streppone.it\/cosimo\/blog\/2011\/08\/using-template-toolkit-with-mojolicious\/\"},\"author\":{\"name\":\"cosimo\",\"@id\":\"https:\/\/www.streppone.it\/cosimo\/blog\/#\/schema\/person\/c443bedbf6ecf99550d6395620801df1\"},\"headline\":\"Using Template Toolkit with Mojolicious\",\"datePublished\":\"2011-08-01T19:13:03+00:00\",\"dateModified\":\"2011-08-01T19:13:03+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/www.streppone.it\/cosimo\/blog\/2011\/08\/using-template-toolkit-with-mojolicious\/\"},\"wordCount\":520,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/www.streppone.it\/cosimo\/blog\/#\/schema\/person\/c443bedbf6ecf99550d6395620801df1\"},\"image\":{\"@id\":\"https:\/\/www.streppone.it\/cosimo\/blog\/2011\/08\/using-template-toolkit-with-mojolicious\/#primaryimage\"},\"thumbnailUrl\":\"http:\/\/www.streppone.it\/img\/mypost20110801.gif\",\"keywords\":[\"cpan\",\"development\",\"github\",\"mojo\",\"mojolicious\",\"Mojolicious::Plugin::TtRenderer\",\"MojoX::Renderer::TT\",\"perl\",\"plack\",\"PSGI\",\"TemplateToolkit\",\"TT\",\"web\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/www.streppone.it\/cosimo\/blog\/2011\/08\/using-template-toolkit-with-mojolicious\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.streppone.it\/cosimo\/blog\/2011\/08\/using-template-toolkit-with-mojolicious\/\",\"url\":\"https:\/\/www.streppone.it\/cosimo\/blog\/2011\/08\/using-template-toolkit-with-mojolicious\/\",\"name\":\"Using Template Toolkit with Mojolicious - Random hacking\",\"isPartOf\":{\"@id\":\"https:\/\/www.streppone.it\/cosimo\/blog\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/www.streppone.it\/cosimo\/blog\/2011\/08\/using-template-toolkit-with-mojolicious\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/www.streppone.it\/cosimo\/blog\/2011\/08\/using-template-toolkit-with-mojolicious\/#primaryimage\"},\"thumbnailUrl\":\"http:\/\/www.streppone.it\/img\/mypost20110801.gif\",\"datePublished\":\"2011-08-01T19:13:03+00:00\",\"dateModified\":\"2011-08-01T19:13:03+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/www.streppone.it\/cosimo\/blog\/2011\/08\/using-template-toolkit-with-mojolicious\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.streppone.it\/cosimo\/blog\/2011\/08\/using-template-toolkit-with-mojolicious\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/www.streppone.it\/cosimo\/blog\/2011\/08\/using-template-toolkit-with-mojolicious\/#primaryimage\",\"url\":\"http:\/\/www.streppone.it\/img\/mypost20110801.gif\",\"contentUrl\":\"http:\/\/www.streppone.it\/img\/mypost20110801.gif\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.streppone.it\/cosimo\/blog\/2011\/08\/using-template-toolkit-with-mojolicious\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/www.streppone.it\/cosimo\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Using Template Toolkit with Mojolicious\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/www.streppone.it\/cosimo\/blog\/#website\",\"url\":\"https:\/\/www.streppone.it\/cosimo\/blog\/\",\"name\":\"Random hacking\",\"description\":\"Assume nothing. Code defensively. Keep it simple, stupid!\",\"publisher\":{\"@id\":\"https:\/\/www.streppone.it\/cosimo\/blog\/#\/schema\/person\/c443bedbf6ecf99550d6395620801df1\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/www.streppone.it\/cosimo\/blog\/?s={search_term_string}\"},\"query-input\":\"required name=search_term_string\"}],\"inLanguage\":\"en-US\"},{\"@type\":[\"Person\",\"Organization\"],\"@id\":\"https:\/\/www.streppone.it\/cosimo\/blog\/#\/schema\/person\/c443bedbf6ecf99550d6395620801df1\",\"name\":\"cosimo\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/www.streppone.it\/cosimo\/blog\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/cb1d938720df45a2720724aae99e3bfc?s=96&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/cb1d938720df45a2720724aae99e3bfc?s=96&r=g\",\"caption\":\"cosimo\"},\"logo\":{\"@id\":\"https:\/\/www.streppone.it\/cosimo\/blog\/#\/schema\/person\/image\/\"},\"url\":\"https:\/\/www.streppone.it\/cosimo\/blog\/author\/cosimo\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Using Template Toolkit with Mojolicious - Random hacking","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.streppone.it\/cosimo\/blog\/2011\/08\/using-template-toolkit-with-mojolicious\/","og_locale":"en_US","og_type":"article","og_title":"Using Template Toolkit with Mojolicious - Random hacking","og_description":"For an upcoming project, I decided to try and use Mojolicious in production. That would be the first time, so I&#39;m quite excited to see what&#39;s going to happen. A few days ago I wrote some sample application that just loads a basic Template Toolkit template and renders it, and benchmarked it using both: mod_perl [&hellip;]","og_url":"https:\/\/www.streppone.it\/cosimo\/blog\/2011\/08\/using-template-toolkit-with-mojolicious\/","og_site_name":"Random hacking","article_published_time":"2011-08-01T19:13:03+00:00","og_image":[{"url":"http:\/\/www.streppone.it\/img\/mypost20110801.gif"}],"author":"cosimo","twitter_card":"summary_large_image","twitter_misc":{"Written by":"cosimo","Est. reading time":"4 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.streppone.it\/cosimo\/blog\/2011\/08\/using-template-toolkit-with-mojolicious\/#article","isPartOf":{"@id":"https:\/\/www.streppone.it\/cosimo\/blog\/2011\/08\/using-template-toolkit-with-mojolicious\/"},"author":{"name":"cosimo","@id":"https:\/\/www.streppone.it\/cosimo\/blog\/#\/schema\/person\/c443bedbf6ecf99550d6395620801df1"},"headline":"Using Template Toolkit with Mojolicious","datePublished":"2011-08-01T19:13:03+00:00","dateModified":"2011-08-01T19:13:03+00:00","mainEntityOfPage":{"@id":"https:\/\/www.streppone.it\/cosimo\/blog\/2011\/08\/using-template-toolkit-with-mojolicious\/"},"wordCount":520,"commentCount":0,"publisher":{"@id":"https:\/\/www.streppone.it\/cosimo\/blog\/#\/schema\/person\/c443bedbf6ecf99550d6395620801df1"},"image":{"@id":"https:\/\/www.streppone.it\/cosimo\/blog\/2011\/08\/using-template-toolkit-with-mojolicious\/#primaryimage"},"thumbnailUrl":"http:\/\/www.streppone.it\/img\/mypost20110801.gif","keywords":["cpan","development","github","mojo","mojolicious","Mojolicious::Plugin::TtRenderer","MojoX::Renderer::TT","perl","plack","PSGI","TemplateToolkit","TT","web"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.streppone.it\/cosimo\/blog\/2011\/08\/using-template-toolkit-with-mojolicious\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.streppone.it\/cosimo\/blog\/2011\/08\/using-template-toolkit-with-mojolicious\/","url":"https:\/\/www.streppone.it\/cosimo\/blog\/2011\/08\/using-template-toolkit-with-mojolicious\/","name":"Using Template Toolkit with Mojolicious - Random hacking","isPartOf":{"@id":"https:\/\/www.streppone.it\/cosimo\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.streppone.it\/cosimo\/blog\/2011\/08\/using-template-toolkit-with-mojolicious\/#primaryimage"},"image":{"@id":"https:\/\/www.streppone.it\/cosimo\/blog\/2011\/08\/using-template-toolkit-with-mojolicious\/#primaryimage"},"thumbnailUrl":"http:\/\/www.streppone.it\/img\/mypost20110801.gif","datePublished":"2011-08-01T19:13:03+00:00","dateModified":"2011-08-01T19:13:03+00:00","breadcrumb":{"@id":"https:\/\/www.streppone.it\/cosimo\/blog\/2011\/08\/using-template-toolkit-with-mojolicious\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.streppone.it\/cosimo\/blog\/2011\/08\/using-template-toolkit-with-mojolicious\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.streppone.it\/cosimo\/blog\/2011\/08\/using-template-toolkit-with-mojolicious\/#primaryimage","url":"http:\/\/www.streppone.it\/img\/mypost20110801.gif","contentUrl":"http:\/\/www.streppone.it\/img\/mypost20110801.gif"},{"@type":"BreadcrumbList","@id":"https:\/\/www.streppone.it\/cosimo\/blog\/2011\/08\/using-template-toolkit-with-mojolicious\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.streppone.it\/cosimo\/blog\/"},{"@type":"ListItem","position":2,"name":"Using Template Toolkit with Mojolicious"}]},{"@type":"WebSite","@id":"https:\/\/www.streppone.it\/cosimo\/blog\/#website","url":"https:\/\/www.streppone.it\/cosimo\/blog\/","name":"Random hacking","description":"Assume nothing. Code defensively. Keep it simple, stupid!","publisher":{"@id":"https:\/\/www.streppone.it\/cosimo\/blog\/#\/schema\/person\/c443bedbf6ecf99550d6395620801df1"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.streppone.it\/cosimo\/blog\/?s={search_term_string}"},"query-input":"required name=search_term_string"}],"inLanguage":"en-US"},{"@type":["Person","Organization"],"@id":"https:\/\/www.streppone.it\/cosimo\/blog\/#\/schema\/person\/c443bedbf6ecf99550d6395620801df1","name":"cosimo","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.streppone.it\/cosimo\/blog\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/cb1d938720df45a2720724aae99e3bfc?s=96&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/cb1d938720df45a2720724aae99e3bfc?s=96&r=g","caption":"cosimo"},"logo":{"@id":"https:\/\/www.streppone.it\/cosimo\/blog\/#\/schema\/person\/image\/"},"url":"https:\/\/www.streppone.it\/cosimo\/blog\/author\/cosimo\/"}]}},"_links":{"self":[{"href":"https:\/\/www.streppone.it\/cosimo\/blog\/wp-json\/wp\/v2\/posts\/446"}],"collection":[{"href":"https:\/\/www.streppone.it\/cosimo\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.streppone.it\/cosimo\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.streppone.it\/cosimo\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.streppone.it\/cosimo\/blog\/wp-json\/wp\/v2\/comments?post=446"}],"version-history":[{"count":0,"href":"https:\/\/www.streppone.it\/cosimo\/blog\/wp-json\/wp\/v2\/posts\/446\/revisions"}],"wp:attachment":[{"href":"https:\/\/www.streppone.it\/cosimo\/blog\/wp-json\/wp\/v2\/media?parent=446"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.streppone.it\/cosimo\/blog\/wp-json\/wp\/v2\/categories?post=446"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.streppone.it\/cosimo\/blog\/wp-json\/wp\/v2\/tags?post=446"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}