{"id":671,"date":"2014-05-26T08:00:00","date_gmt":"2014-05-26T07:00:00","guid":{"rendered":"http:\/\/www.diogonunes.com\/blog\/?p=671"},"modified":"2020-05-15T14:24:43","modified_gmt":"2020-05-15T13:24:43","slug":"rails-vs-django-vs-play-frameworks","status":"publish","type":"post","link":"https:\/\/www.diogonunes.com\/blog\/rails-vs-django-vs-play-frameworks\/","title":{"rendered":"Rails vs Django vs Play: Battle of frameworks"},"content":{"rendered":"<p><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" src=\"https:\/\/i0.wp.com\/www.diogonunes.com\/blog\/wp-content\/uploads\/2014\/09\/rails-vs-django-vs-play.jpg?resize=580%2C337\" alt=\"rails-vs-django-vs-play\" width=\"580\" height=\"337\" class=\"aligncenter size-full wp-image-1306\" srcset=\"https:\/\/i0.wp.com\/www.diogonunes.com\/blog\/wp-content\/uploads\/2014\/09\/rails-vs-django-vs-play.jpg?w=946&amp;ssl=1 946w, https:\/\/i0.wp.com\/www.diogonunes.com\/blog\/wp-content\/uploads\/2014\/09\/rails-vs-django-vs-play.jpg?resize=400%2C232&amp;ssl=1 400w\" sizes=\"auto, (max-width: 580px) 100vw, 580px\" \/><\/p>\n<h3>This post is a review of those three frameworks considering four criteria: Ease of learning, Speed of development, Tools\/Plugins, and Community.<\/h3>\n<p><!--more--><\/p>\n<p>Right from the start I banished PHP from my possible choices. I know that <em>&#8220;sufficiently talented coders can write great applications in terrible languages&#8221;<\/em> (<a href=\"http:\/\/blog.codinghorror.com\/php-sucks-but-it-doesnt-matter\/\">Jeff Atwood<\/a>), but I just don&#8217;t like PHP, probably because of its syntax, and <a href=\"http:\/\/www.reddit.com\/r\/PHP\/comments\/1fy71s\/why_do_so_many_developers_hate_php\/\">I&#8217;m not the only one<\/a>. You can find a lot of ____ vs PHP comparisons online, and you&#8217;ll see that the <em>challenger<\/em> always win &#8211; except for <a href=\"http:\/\/www.leonardteo.com\/2012\/07\/ruby-on-rails-vs-php-the-good-the-bad\/\">legacy<\/a> reasons. And the main challengers I&#8217;m talking about are JavaScript (Node.JS), Ruby (Rails), Python (Django) and Java (Play).<\/p>\n<p>My objective was to create a platform similar to <a href=\"http:\/\/stackoverflow.com\/\">StackOverflow<\/a>. Although everyone suggested me to go with Rails, I chose Django. Our relationship lasted <a href=\"https:\/\/github.com\/dialex\/dcid_django\/commits\/master\">four sad months<\/a> and I <em>broke up<\/em> before finishing the prototype. So I moved to Play Framework and achieved the same functionality in <a href=\"https:\/\/github.com\/dialex\/dcid_play\/commits\/master\">two months<\/a> with less frustration. Finally I switched to Rails and implemented all that and much more, finishing the prototype in less than half that time &#8211; <a href=\"https:\/\/github.com\/dialex\/dcid\">22 days<\/a>. Looks like <em>everyone<\/em> was right in the first place.<\/p>\n<p>This post is a review of those three frameworks considering four criteria: <strong>Ease of learning<\/strong> (programming language, documentation, tutorials), <strong>Speed of development<\/strong> (programming productivity), <strong>Tools &amp; Plugins<\/strong>, and <strong>Community<\/strong>.<\/p>\n<h3>Django<\/h3>\n<p>Django uses Python, known for its <a href=\"http:\/\/en.wikipedia.org\/wiki\/Python_syntax_and_semantics\">simplicity and indentation rules<\/a>, which makes it a good language for programming beginners. The <a href=\"http:\/\/legacy.python.org\/dev\/peps\/pep-0020\/\">Zen of Python<\/a> advises that <em>&#8220;there should be one, and preferably only one, obvious way to do it&#8221;<\/em> and it should be well <a href=\"http:\/\/stackoverflow.com\/questions\/7103500\/learning-web-development-django-vs-node-vs-rails-vs-others\/7104442#7104442\">documented<\/a>. Since my <a href=\"http:\/\/www.osqa.net\/\">Q&amp;A website<\/a> just required the basic functionality of every dynamic website &#8211; create user, authenticate, post question, make comment, cast vote &#8211; I guessed there would be plenty tutorials explaining how to implement the basics using the one right way. <strong>The <a href=\"https:\/\/docs.djangoproject.com\/en\/\">official documentation<\/a> exists but it won&#8217;t be enough if you&#8217;re a beginner<\/strong> at dynamic web development. Sometimes <strong>it assumes you know<\/strong> something and skips an explanation that would help you understand the big picture. Doing <a href=\"https:\/\/www.codecademy.com\/catalog\/language\/python\">Codecademy&#8217;s python course<\/a> also helped me get a grasp on Python&#8217;s syntax and semantics but that&#8217;s like learning the abc. You might want to watch <a href=\"https:\/\/www.youtube.com\/playlist?list=PLxxA5z-8B2xk4szCgFmgonNcCboyNneMD\">these video tutorials<\/a>.<\/p>\n<p><strong>I installed Django on Windows: bad move.<\/strong> It was a long and painful process, requiring multiple small tweaks to silence the errors. I sure hope the process is a lot smoother on Linux. After having a hard time installing and configuring Python + Django + WAMP + Aptana Studio (IDE) I was ready to code. I followed Django&#8217;s official tutorial (v1.4 at that time), a <a href=\"http:\/\/wiht.link\/django_primer\">walkthrough<\/a> to create a <em>&#8220;site that lets people view polls and vote&#8221;<\/em> which suited my initial goal after some customization.<\/p>\n<p>Django uses <a href=\"http:\/\/www.djangobook.com\/en\/2.0\/chapter05.html#the-mtv-or-mvc-development-pattern\">MTV (Model, Template, View)<\/a> instead of <a href=\"http:\/\/en.wikipedia.org\/wiki\/Model%E2%80%93view%E2%80%93controller\">MVC (Model, View, Controller)<\/a>, so <code>Django's Templates == everyone else's Views<\/code> and <code>Django's Views == everyone else's Controllers<\/code>. Your main application is composed of modules; actually your app is also a module. So you create your app, you give it an innovative name <code>Contoso<\/code>, and then you&#8217;re forced to create a module &#8211; where the actual code will be placed &#8211; but with a different name. <em>Sigh<\/em>. Instead of <code>ContosoForReal<\/code> let&#8217;s call it <code>ContosoMainModule<\/code>. <strong>After you look at Django&#8217;s folder structure you start to get anxious.<\/strong> Your <code>Contoso<\/code> app folder only stores the url routing file (<code>urls.py<\/code>) and the global settings (<code>settings.py<\/code>); Your <code>ContosoMainModule<\/code> folder contains the models (<code>models.py<\/code>), the controllers (<code>views.py<\/code>), yet another url routing file (<code>urls.py<\/code>), and a folder named <code>templatetags<\/code>. So where would you put the templates? In the same folder next to the model and the controllers? <code>templatetags<\/code> is a good candidate for that. Nop, they&#8217;ll be placed outside <code>ContosoMainModule<\/code>, side-by-side with your app folder <code>Contoso<\/code> at <code>templates\\ContosoMainModule<\/code>, <a href=\"https:\/\/github.com\/dialex\/dcid_django\">see for yourself<\/a>. <em>Sigh<\/em>.<\/p>\n<p>Indentation is a big thing for Python, in fact your code won&#8217;t compile if your code isn&#8217;t properly formatted. If you didn&#8217;t know you&#8217;ll find out pretty soon, after you start getting compile errors with cryptic error messages. Time to turn on the whitespace highlighter and search for that naughty tab or space (just don&#8217;t mix tabs with spaces!). <em>Sigh<\/em>. <strong>The whole time it looks like you&#8217;re fighting a battle with the framework<\/strong>, to see who controls who. You have to specify everything to the last detail; seriously I had to search <a href=\"http:\/\/stackoverflow.com\/a\/11965793\/675577\">how to auto-increment an Id primary key<\/a>, why isn&#8217;t that a default?<\/p>\n<p>The only tool I used for Django was an IDE and it didn&#8217;t help me much. I used Aptana Studio which is basically an Eclipse <em>distribution<\/em> optimized for web technologies. Although Aptana is great for HTML\/CSS\/PHP, its Django support is weak: <strong>no syntax highlight<\/strong> for Django-specific files (only Python) and the <strong>auto-complete rarely completes anything<\/strong>. When you&#8217;re still discovering the framework and its API, an auto-complete would be a precious help. <em>Sigh<\/em>.<\/p>\n<p>Thankfully, <strong>the community exists, both on StackOverflow and Google Plus<\/strong>, and is there to help you. All my questions and doubts were always answered in time. In one year Django went from 1.4 to 1.7, thus the core development team is pretty active. Also there are plenty of modules (plugins) for your applications available online, but some are more plug&#8217;n&#8217;play than others. There were so many authentication modules I couldn&#8217;t choose which one to use. I tried to use a voting plugin. I ended up creating my own. <em>There should be one obvious way to do it<\/em>. <em>Sigh<\/em>.<\/p>\n<p><strong>tl;dr<\/strong> developing on Django is an exhausting symphony of sighs.<br \/>\n&#8211; \u2605\u2605\u2605\u2606\u2606 Ease of learning<br \/>\n&#8211; \u2605\u2605\u2606\u2606\u2606 Speed of development<br \/>\n&#8211; \u2605\u2605\u2605\u2606\u2606 Tools &amp; plugins<br \/>\n&#8211; \u2605\u2605\u2605\u2605\u2606 Community<\/p>\n<h3>Play<\/h3>\n<p>But wait, <strong>why should I learn Python+Django from scratch when I could leverage on my Java skills and use them for webdev?<\/strong> So Play Framework came to the rescue. Right away, I removed the effort of learning a new programming language. Besides I always enjoyed programming on Java. The quantity of <a href=\"http:\/\/www.playframework.com\/documentation\">official documentation<\/a> was similar to Django&#8217;s (ok maybe less) but it was more comprehensive and dummy-proof. &#8220;<a href=\"http:\/\/www.playframework.com\/documentation\/2.3.x\/JavaGuide1\">Zentasks<\/a>&#8221; is a tutorial that guides you on the process of creating a website for task management. It&#8217;s so much better than Django&#8217;s approach: here <strong>you start the tutorial with a clear tangible goal<\/strong>; content is presented incrementally and logically; and plenty information and examples are provided on what you need to do and why.<\/p>\n<p>The <a href=\"http:\/\/www.diogonunes.com\/blog\/installing-play-framework-2-1-on-windows\/\">environment installation<\/a> was so <strong>much easier<\/strong> (on Windows): JDK + Play + Eclipse + Config <code>%JAVA_PATH%<\/code>. <em>Simple<\/em>. My typical workflow was opening two command lines (one that automatically compiles the project after each change and another that acts as a local webserver), change the code on Eclipse, refresh the page on the browser. <em>Simple<\/em>, no more &#8220;how do I do ___ on Python&#8230;&#8221;, just think and code it. The <a href=\"https:\/\/github.com\/dialex\/dcid_play\/\">folder structure<\/a> makes a lot <strong>more sense<\/strong>: an <code>app<\/code> folder with a separate folder for <code>models<\/code>, <code>controllers<\/code> and <code>views<\/code>; a <code>public<\/code> folder for static content; a <code>conf<\/code> for configurations and <code>evolutions<\/code> for database migration files; a <code>test<\/code> folder for tests. <em>Simple<\/em>.<\/p>\n<p><strong>Play&#8217;s template system to avoid boilerplate is really useful and it looks a lot like inheritance.<\/strong> Each <a href=\"https:\/\/github.com\/dialex\/dcid_play\/blob\/master\/app\/views\/base.scala.html\">template<\/a> may receive inputs and define &#8220;blocks&#8221;; those <a href=\"https:\/\/github.com\/dialex\/dcid_play\/blob\/master\/app\/views\/baseSite.scala.html\">inputs<\/a> are used to fill the dynamic parts of the template (like the user&#8217;s name); and those <a href=\"https:\/\/github.com\/dialex\/dcid_play\/blob\/master\/app\/views\/index.scala.html\">blocks<\/a> can be <code>implemented<\/code> or <code>overrided<\/code> by other templates that <code>extend<\/code> the original template. <em>Simple<\/em>, powerful, and <em>coherent<\/em> since you&#8217;re using Java\/OOP concepts across the framework. The only problem I faced was ManyToOne and OneToMany relationships. I was trying to code a tag system, where I could get from a Tag all tagged questions and from a Question all of its Tags, so <code>One Question<\/code> has <code>Many Tags<\/code> and <code>One Tag<\/code> has <code>Many Questions<\/code>. I <a href=\"http:\/\/stackoverflow.com\/questions\/16286700\/manytomany-relation-with-play-framework-1-2-5-jpa\">never<\/a> managed to make it <a href=\"http:\/\/stackoverflow.com\/questions\/18298173\/how-to-populate-a-manytomany-relationship-using-yaml-on-play-framework-2-1-x\">work<\/a> like I wanted.<\/p>\n<p>Developing Play or Java on Eclipse is great, the syntax highlighting and auto-complete just works. You also have access to all those Eclipse plugins that make your life easier (github integration, checkstyle, findbugs, etc.) Having the possibility to develop <strong>JUnit tests<\/strong> is also handy, and <em>coherent<\/em> once again, but I didn&#8217;t really had the time to create them.<\/p>\n<p><strong>I tried once to deploy<\/strong> my Play application on Cloudbees and <strong>it wasn&#8217;t straightforward<\/strong>. The problem had something to do with a configuration, since my app was using a local database and I had to create another rule for the remote database. Cloudbees&#8217; support helped me a lot but before we could fix the issue I moved to Rails. Have a loom on how you can <a href=\"http:\/\/www.playframework.com\/documentation\/2.4.x\/Production\">deploy your app<\/a><\/p>\n<p><strong>tl;dr<\/strong> perfect if you know Java and want to develop web applications, it just works.<br \/>\n&#8211; \u2605\u2605\u2605\u2605\u2605 Ease of learning<br \/>\n&#8211; \u2605\u2605\u2605\u2605\u2606 Speed of development<br \/>\n&#8211; \u2605\u2605\u2605\u2606\u2606 Tools &amp; plugins<br \/>\n&#8211; \u2605\u2605\u2605\u2606\u2606 Community<\/p>\n<h3>Rails<\/h3>\n<p>There are so many great places to start learning Ruby and Rails. <strong>99% of what you&#8217;ll ever need is documented online by the community<\/strong>; I only visited the official docs to check specific the signature of specific methods. First, you should do the quick course <a href=\"http:\/\/tryruby.org\/levels\/1\/challenges\/0\">Try Ruby<\/a>, then get a <a href=\"http:\/\/www.diogonunes.com\/blog\/set-up-your-rails-env\/\">Ruby\/Rails development environment<\/a>, and finally follow every step of <a href=\"http:\/\/www.railstutorial.org\/book\">The Ruby on Rails Tutorial<\/a> by Michael Hartl. You also have <a href=\"http:\/\/railscasts.com\/\">screencasts<\/a> available. Ruby has a very natural and concise syntax, so if you&#8217;re a programmer used to highly verbose languages (e.g. Java) you&#8217;ll take a while to get used to it.<\/p>\n<p><strong>Rails development is blazing fast<\/strong>. Most of this development speed is achieved through auto-generated code that does make some (fair) assumptions. For instance, if you create a &#96;User&#96; model it assumes you&#8217;ll need an auto-incremented &#96;ID&#96; to identify each &#96;User&#96;, and Rails takes care of it for you. Model relationships are as easy as <code>User has_many :questions<\/code>. <em>Not bad<\/em>. I pretty much followed Michael&#8217;s tutorial from end-to-end, since it covered almost everything I needed for my project, so I never really got stuck. And <strong>coding tests<\/strong> is the best, <strong>it&#8217;s like plain English<\/strong>:<\/p>\n<pre><code>describe \"after saving the user\" do\n  before { click_button submit }\n  let(:user) { User.find_by(email: 'alice@wonderland.com') }\n\n  it { should have_link('Exit') }\n  it { should have_title(user.name) }\n  it { should have_selector('div.alert.alert-success') }\nend\n<\/code><\/pre>\n<p><em>Not bad at all!<\/em> And <strong>the template system is even better than Play&#8217;s<\/strong>. They have the notion of <code>partials<\/code> which is just a block of reusable code. So on Play I had to inherit a base template and implement every empty block &#8211; hence, the &#8220;baggage&#8221; of the base template always came attached. Rails uses composition: for example you define a partial that receives a <code>Question<\/code> ID and displays the voting buttons for that specific <code>Question<\/code>. Anytime you need to display voting buttons for a question, just <code>&lt;%= render vote_buttons_question, :id =&gt; 123<\/code> anywhere your code. And partials than call other partials. Do you want to change the buttons&#8217; color? Just change the partial! <a href=\"http:\/\/youtu.be\/WVDfAthF6sA?t=13m2s\"><em>Nice!<\/em><\/a><\/p>\n<p>At that time <strong>I had given up on IDEs<\/strong>. Michael advised to use Sublime Text and I wanted to learn more about Sublime, so I sticked with it. I lost auto-completion but I gained coding performance, like Sublime&#8217;s quick find (Ctrl+P) that saves you from navigating through the folders to open a file just by typing the file&#8217;s name. And you can&#8217;t place breakpoints to debug your code, I really miss that feature. So sometimes I had to <a href=\"http:\/\/repl.it\/languages\/Ruby\">paste my Ruby code online and run it<\/a>, debugging it via command line. A really handy tool.<\/p>\n<p>And <strong>gems just work<\/strong> the way a plugin should work. I needed a voting system: <code>gem 'thumbs_up'<\/code> + <code>Question acts_as_voteable<\/code> + <code>User acts_as_voter<\/code> = done. I needed to encode emails to prevent spam: <code>gem 'actionview-encoded_mail_to'<\/code>. App monitoring? <code>gem 'newrelic_rpm'<\/code> Font Awesome? <code>gem 'font-awesome-rails'<\/code>. Deploy? After the initial configuration it&#8217;s as easy as <code>git push heroku master; heroku run rake db:migrate<\/code>.<\/p>\n<p>This is <strong>the power that comes from an active open-source community<\/strong>: somewhere in time, someone had your problem, solved it, and provided a solution for everyone else. Again, find them at Google+, StackOverflow, and on local meetups.<\/p>\n<p><strong>tl;dr<\/strong> Rails enables fast development great for prototyping. The more you use it the more you love it.<br \/>\n&#8211; \u2605\u2605\u2605\u2605\u2606 Ease of learning<br \/>\n&#8211; \u2605\u2605\u2605\u2605\u2605 Speed of development<br \/>\n&#8211; \u2605\u2605\u2605\u2605\u2606 Tools &amp; plugins<br \/>\n&#8211; \u2605\u2605\u2605\u2605\u2606 Community<\/p>\n<h3>And the winner is&#8230;<\/h3>\n<p><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" src=\"https:\/\/i0.wp.com\/www.diogonunes.com\/blog\/wp-content\/uploads\/2014\/09\/home-by-now.png?resize=350%2C350\" alt=\"home-by-now\" width=\"350\" height=\"350\" class=\"aligncenter size-full wp-image-1307\" srcset=\"https:\/\/i0.wp.com\/www.diogonunes.com\/blog\/wp-content\/uploads\/2014\/09\/home-by-now.png?w=350&amp;ssl=1 350w, https:\/\/i0.wp.com\/www.diogonunes.com\/blog\/wp-content\/uploads\/2014\/09\/home-by-now.png?resize=150%2C150&amp;ssl=1 150w\" sizes=\"auto, (max-width: 350px) 100vw, 350px\" \/><\/p>\n<p>Any questions?<\/p>\n","protected":false},"excerpt":{"rendered":"<p>This post is a review of those three frameworks considering four criteria: Ease of learning, Speed of development, Tools\/Plugins, and Community.<\/p>\n","protected":false},"author":1,"featured_media":1306,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_jetpack_memberships_contains_paid_content":false,"footnotes":""},"categories":[2],"tags":[29,8,30,22,48],"class_list":["post-671","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-tech","tag-coding","tag-play-framework","tag-ruby-on-rails","tag-review","tag-web-dev"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v26.6 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Rails vs Django vs Play: Battle of frameworks - The Geeky Gecko<\/title>\n<meta name=\"description\" content=\"This post is a review of those three frameworks considering four criteria: Ease of learning, Speed of development, Tools &amp; plugins, and Community\" \/>\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.diogonunes.com\/blog\/rails-vs-django-vs-play-frameworks\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Rails vs Django vs Play: Battle of frameworks - The Geeky Gecko\" \/>\n<meta property=\"og:description\" content=\"This post is a review of those three frameworks considering four criteria: Ease of learning, Speed of development, Tools &amp; plugins, and Community\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.diogonunes.com\/blog\/rails-vs-django-vs-play-frameworks\/\" \/>\n<meta property=\"og:site_name\" content=\"The Geeky Gecko\" \/>\n<meta property=\"article:published_time\" content=\"2014-05-26T07:00:00+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2020-05-15T13:24:43+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/i0.wp.com\/www.diogonunes.com\/blog\/wp-content\/uploads\/2014\/09\/rails-vs-django-vs-play.jpg?fit=946%2C550&ssl=1\" \/>\n\t<meta property=\"og:image:width\" content=\"946\" \/>\n\t<meta property=\"og:image:height\" content=\"550\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"author\" content=\"Diogo Nunes\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@dialexnunes\" \/>\n<meta name=\"twitter:site\" content=\"@dialexnunes\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Diogo Nunes\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"10 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/www.diogonunes.com\/blog\/rails-vs-django-vs-play-frameworks\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/www.diogonunes.com\/blog\/rails-vs-django-vs-play-frameworks\/\"},\"author\":{\"name\":\"Diogo Nunes\",\"@id\":\"https:\/\/www.diogonunes.com\/blog\/#\/schema\/person\/a6fa79b293f22912664654fcfbd2da0c\"},\"headline\":\"Rails vs Django vs Play: Battle of frameworks\",\"datePublished\":\"2014-05-26T07:00:00+00:00\",\"dateModified\":\"2020-05-15T13:24:43+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/www.diogonunes.com\/blog\/rails-vs-django-vs-play-frameworks\/\"},\"wordCount\":1956,\"publisher\":{\"@id\":\"https:\/\/www.diogonunes.com\/blog\/#\/schema\/person\/a6fa79b293f22912664654fcfbd2da0c\"},\"image\":{\"@id\":\"https:\/\/www.diogonunes.com\/blog\/rails-vs-django-vs-play-frameworks\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/i0.wp.com\/www.diogonunes.com\/blog\/wp-content\/uploads\/2014\/09\/rails-vs-django-vs-play.jpg?fit=946%2C550&ssl=1\",\"keywords\":[\"coding\",\"play framework\",\"rails\",\"review\",\"web dev\"],\"articleSection\":[\"Technology\"],\"inLanguage\":\"en-US\"},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.diogonunes.com\/blog\/rails-vs-django-vs-play-frameworks\/\",\"url\":\"https:\/\/www.diogonunes.com\/blog\/rails-vs-django-vs-play-frameworks\/\",\"name\":\"Rails vs Django vs Play: Battle of frameworks - The Geeky Gecko\",\"isPartOf\":{\"@id\":\"https:\/\/www.diogonunes.com\/blog\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/www.diogonunes.com\/blog\/rails-vs-django-vs-play-frameworks\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/www.diogonunes.com\/blog\/rails-vs-django-vs-play-frameworks\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/i0.wp.com\/www.diogonunes.com\/blog\/wp-content\/uploads\/2014\/09\/rails-vs-django-vs-play.jpg?fit=946%2C550&ssl=1\",\"datePublished\":\"2014-05-26T07:00:00+00:00\",\"dateModified\":\"2020-05-15T13:24:43+00:00\",\"description\":\"This post is a review of those three frameworks considering four criteria: Ease of learning, Speed of development, Tools & plugins, and Community\",\"breadcrumb\":{\"@id\":\"https:\/\/www.diogonunes.com\/blog\/rails-vs-django-vs-play-frameworks\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.diogonunes.com\/blog\/rails-vs-django-vs-play-frameworks\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/www.diogonunes.com\/blog\/rails-vs-django-vs-play-frameworks\/#primaryimage\",\"url\":\"https:\/\/i0.wp.com\/www.diogonunes.com\/blog\/wp-content\/uploads\/2014\/09\/rails-vs-django-vs-play.jpg?fit=946%2C550&ssl=1\",\"contentUrl\":\"https:\/\/i0.wp.com\/www.diogonunes.com\/blog\/wp-content\/uploads\/2014\/09\/rails-vs-django-vs-play.jpg?fit=946%2C550&ssl=1\",\"width\":946,\"height\":550},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.diogonunes.com\/blog\/rails-vs-django-vs-play-frameworks\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/www.diogonunes.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Rails vs Django vs Play: Battle of frameworks\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/www.diogonunes.com\/blog\/#website\",\"url\":\"https:\/\/www.diogonunes.com\/blog\/\",\"name\":\"The Geeky Gecko\",\"description\":\"The Geeky Gecko\",\"publisher\":{\"@id\":\"https:\/\/www.diogonunes.com\/blog\/#\/schema\/person\/a6fa79b293f22912664654fcfbd2da0c\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/www.diogonunes.com\/blog\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":[\"Person\",\"Organization\"],\"@id\":\"https:\/\/www.diogonunes.com\/blog\/#\/schema\/person\/a6fa79b293f22912664654fcfbd2da0c\",\"name\":\"Diogo Nunes\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/www.diogonunes.com\/blog\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/i0.wp.com\/www.diogonunes.com\/blog\/wp-content\/uploads\/2026\/04\/Geeky-Gecko-2026-v2.png?fit=799%2C799&ssl=1\",\"contentUrl\":\"https:\/\/i0.wp.com\/www.diogonunes.com\/blog\/wp-content\/uploads\/2026\/04\/Geeky-Gecko-2026-v2.png?fit=799%2C799&ssl=1\",\"width\":799,\"height\":799,\"caption\":\"Diogo Nunes\"},\"logo\":{\"@id\":\"https:\/\/www.diogonunes.com\/blog\/#\/schema\/person\/image\/\"},\"sameAs\":[\"http:\/\/www.diogonunes.com\",\"https:\/\/x.com\/dialexnunes\"],\"url\":\"https:\/\/www.diogonunes.com\/blog\/author\/diogo-nunes\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Rails vs Django vs Play: Battle of frameworks - The Geeky Gecko","description":"This post is a review of those three frameworks considering four criteria: Ease of learning, Speed of development, Tools & plugins, and Community","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.diogonunes.com\/blog\/rails-vs-django-vs-play-frameworks\/","og_locale":"en_US","og_type":"article","og_title":"Rails vs Django vs Play: Battle of frameworks - The Geeky Gecko","og_description":"This post is a review of those three frameworks considering four criteria: Ease of learning, Speed of development, Tools & plugins, and Community","og_url":"https:\/\/www.diogonunes.com\/blog\/rails-vs-django-vs-play-frameworks\/","og_site_name":"The Geeky Gecko","article_published_time":"2014-05-26T07:00:00+00:00","article_modified_time":"2020-05-15T13:24:43+00:00","og_image":[{"width":946,"height":550,"url":"https:\/\/i0.wp.com\/www.diogonunes.com\/blog\/wp-content\/uploads\/2014\/09\/rails-vs-django-vs-play.jpg?fit=946%2C550&ssl=1","type":"image\/jpeg"}],"author":"Diogo Nunes","twitter_card":"summary_large_image","twitter_creator":"@dialexnunes","twitter_site":"@dialexnunes","twitter_misc":{"Written by":"Diogo Nunes","Est. reading time":"10 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.diogonunes.com\/blog\/rails-vs-django-vs-play-frameworks\/#article","isPartOf":{"@id":"https:\/\/www.diogonunes.com\/blog\/rails-vs-django-vs-play-frameworks\/"},"author":{"name":"Diogo Nunes","@id":"https:\/\/www.diogonunes.com\/blog\/#\/schema\/person\/a6fa79b293f22912664654fcfbd2da0c"},"headline":"Rails vs Django vs Play: Battle of frameworks","datePublished":"2014-05-26T07:00:00+00:00","dateModified":"2020-05-15T13:24:43+00:00","mainEntityOfPage":{"@id":"https:\/\/www.diogonunes.com\/blog\/rails-vs-django-vs-play-frameworks\/"},"wordCount":1956,"publisher":{"@id":"https:\/\/www.diogonunes.com\/blog\/#\/schema\/person\/a6fa79b293f22912664654fcfbd2da0c"},"image":{"@id":"https:\/\/www.diogonunes.com\/blog\/rails-vs-django-vs-play-frameworks\/#primaryimage"},"thumbnailUrl":"https:\/\/i0.wp.com\/www.diogonunes.com\/blog\/wp-content\/uploads\/2014\/09\/rails-vs-django-vs-play.jpg?fit=946%2C550&ssl=1","keywords":["coding","play framework","rails","review","web dev"],"articleSection":["Technology"],"inLanguage":"en-US"},{"@type":"WebPage","@id":"https:\/\/www.diogonunes.com\/blog\/rails-vs-django-vs-play-frameworks\/","url":"https:\/\/www.diogonunes.com\/blog\/rails-vs-django-vs-play-frameworks\/","name":"Rails vs Django vs Play: Battle of frameworks - The Geeky Gecko","isPartOf":{"@id":"https:\/\/www.diogonunes.com\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.diogonunes.com\/blog\/rails-vs-django-vs-play-frameworks\/#primaryimage"},"image":{"@id":"https:\/\/www.diogonunes.com\/blog\/rails-vs-django-vs-play-frameworks\/#primaryimage"},"thumbnailUrl":"https:\/\/i0.wp.com\/www.diogonunes.com\/blog\/wp-content\/uploads\/2014\/09\/rails-vs-django-vs-play.jpg?fit=946%2C550&ssl=1","datePublished":"2014-05-26T07:00:00+00:00","dateModified":"2020-05-15T13:24:43+00:00","description":"This post is a review of those three frameworks considering four criteria: Ease of learning, Speed of development, Tools & plugins, and Community","breadcrumb":{"@id":"https:\/\/www.diogonunes.com\/blog\/rails-vs-django-vs-play-frameworks\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.diogonunes.com\/blog\/rails-vs-django-vs-play-frameworks\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.diogonunes.com\/blog\/rails-vs-django-vs-play-frameworks\/#primaryimage","url":"https:\/\/i0.wp.com\/www.diogonunes.com\/blog\/wp-content\/uploads\/2014\/09\/rails-vs-django-vs-play.jpg?fit=946%2C550&ssl=1","contentUrl":"https:\/\/i0.wp.com\/www.diogonunes.com\/blog\/wp-content\/uploads\/2014\/09\/rails-vs-django-vs-play.jpg?fit=946%2C550&ssl=1","width":946,"height":550},{"@type":"BreadcrumbList","@id":"https:\/\/www.diogonunes.com\/blog\/rails-vs-django-vs-play-frameworks\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.diogonunes.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Rails vs Django vs Play: Battle of frameworks"}]},{"@type":"WebSite","@id":"https:\/\/www.diogonunes.com\/blog\/#website","url":"https:\/\/www.diogonunes.com\/blog\/","name":"The Geeky Gecko","description":"The Geeky Gecko","publisher":{"@id":"https:\/\/www.diogonunes.com\/blog\/#\/schema\/person\/a6fa79b293f22912664654fcfbd2da0c"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.diogonunes.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":["Person","Organization"],"@id":"https:\/\/www.diogonunes.com\/blog\/#\/schema\/person\/a6fa79b293f22912664654fcfbd2da0c","name":"Diogo Nunes","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.diogonunes.com\/blog\/#\/schema\/person\/image\/","url":"https:\/\/i0.wp.com\/www.diogonunes.com\/blog\/wp-content\/uploads\/2026\/04\/Geeky-Gecko-2026-v2.png?fit=799%2C799&ssl=1","contentUrl":"https:\/\/i0.wp.com\/www.diogonunes.com\/blog\/wp-content\/uploads\/2026\/04\/Geeky-Gecko-2026-v2.png?fit=799%2C799&ssl=1","width":799,"height":799,"caption":"Diogo Nunes"},"logo":{"@id":"https:\/\/www.diogonunes.com\/blog\/#\/schema\/person\/image\/"},"sameAs":["http:\/\/www.diogonunes.com","https:\/\/x.com\/dialexnunes"],"url":"https:\/\/www.diogonunes.com\/blog\/author\/diogo-nunes\/"}]}},"jetpack_featured_media_url":"https:\/\/i0.wp.com\/www.diogonunes.com\/blog\/wp-content\/uploads\/2014\/09\/rails-vs-django-vs-play.jpg?fit=946%2C550&ssl=1","jetpack-related-posts":[{"id":665,"url":"https:\/\/www.diogonunes.com\/blog\/ruby-on-rails-an-overview-on-why-its-so-good\/","url_meta":{"origin":671,"position":0},"title":"Ruby on Rails: an overview on why it&#8217;s so good","author":"Diogo Nunes","date":"5 May, 2014","format":false,"excerpt":"I was in denial for a while but now I get why Rails is so good. First things first, what is Rails anyway? Ruby on Rails is a framework that allows you to develop web applications using the MVC design pattern. Generally speaking a framework is a higher-level abstraction that\u2026","rel":"","context":"In &quot;Technology&quot;","block_context":{"text":"Technology","link":"https:\/\/www.diogonunes.com\/blog\/category\/tech\/"},"img":{"alt_text":"www.tryruby.org","src":"https:\/\/i0.wp.com\/www.diogonunes.com\/blog\/wp-content\/uploads\/2014\/05\/try-ruby-e1373488411601.jpg?fit=500%2C375&ssl=1&resize=350%2C200","width":350,"height":200},"classes":[]},{"id":805,"url":"https:\/\/www.diogonunes.com\/blog\/conclusions-after-6-months-of-blogging\/","url_meta":{"origin":671,"position":1},"title":"Conclusions after 6 months of blogging","author":"Diogo Nunes","date":"30 June, 2014","format":false,"excerpt":"Thanks to Google Analytics I can compare several metrics about my website before and after blogging. Here are my findings. I started blogging on the 1st of January 2014, so this comparison will focus on (Jan 1 - 31 May, 2014) vs. (Jan 1 - 31 May, 2013). A blog\u2026","rel":"","context":"In &quot;Writing&quot;","block_context":{"text":"Writing","link":"https:\/\/www.diogonunes.com\/blog\/category\/writing\/"},"img":{"alt_text":"","src":"https:\/\/i0.wp.com\/www.diogonunes.com\/blog\/wp-content\/uploads\/2014\/06\/Google-Analytics.png?fit=839%2C375&ssl=1&resize=350%2C200","width":350,"height":200,"srcset":"https:\/\/i0.wp.com\/www.diogonunes.com\/blog\/wp-content\/uploads\/2014\/06\/Google-Analytics.png?fit=839%2C375&ssl=1&resize=350%2C200 1x, https:\/\/i0.wp.com\/www.diogonunes.com\/blog\/wp-content\/uploads\/2014\/06\/Google-Analytics.png?fit=839%2C375&ssl=1&resize=525%2C300 1.5x, https:\/\/i0.wp.com\/www.diogonunes.com\/blog\/wp-content\/uploads\/2014\/06\/Google-Analytics.png?fit=839%2C375&ssl=1&resize=700%2C400 2x"},"classes":[]},{"id":4204,"url":"https:\/\/www.diogonunes.com\/blog\/framework-review-playwright\/","url_meta":{"origin":671,"position":2},"title":"Framework review: Playwright","author":"Diogo Nunes","date":"29 March, 2021","format":false,"excerpt":"Playwright enables end-to-end testing. Test modern single page apps, across all modern browsers, using in your preferred language (JS, TS, Java, C#, Python). \u2014 Official website Code Example of automation at GitHub. Use cases \ud83e\udd48 Automate end-to-end (E2E) tests using the UI. It also supports mocks. Learning curve \ud83e\udd48 Most\u2026","rel":"","context":"In &quot;Technology&quot;","block_context":{"text":"Technology","link":"https:\/\/www.diogonunes.com\/blog\/category\/tech\/"},"img":{"alt_text":"","src":"https:\/\/i0.wp.com\/www.diogonunes.com\/blog\/wp-content\/uploads\/2021\/03\/fatih-kilic-m1dM7ZXvdMs-unsplash.jpg?fit=1200%2C773&ssl=1&resize=350%2C200","width":350,"height":200,"srcset":"https:\/\/i0.wp.com\/www.diogonunes.com\/blog\/wp-content\/uploads\/2021\/03\/fatih-kilic-m1dM7ZXvdMs-unsplash.jpg?fit=1200%2C773&ssl=1&resize=350%2C200 1x, https:\/\/i0.wp.com\/www.diogonunes.com\/blog\/wp-content\/uploads\/2021\/03\/fatih-kilic-m1dM7ZXvdMs-unsplash.jpg?fit=1200%2C773&ssl=1&resize=525%2C300 1.5x, https:\/\/i0.wp.com\/www.diogonunes.com\/blog\/wp-content\/uploads\/2021\/03\/fatih-kilic-m1dM7ZXvdMs-unsplash.jpg?fit=1200%2C773&ssl=1&resize=700%2C400 2x, https:\/\/i0.wp.com\/www.diogonunes.com\/blog\/wp-content\/uploads\/2021\/03\/fatih-kilic-m1dM7ZXvdMs-unsplash.jpg?fit=1200%2C773&ssl=1&resize=1050%2C600 3x"},"classes":[]},{"id":868,"url":"https:\/\/www.diogonunes.com\/blog\/download-counter-for-your-websites-files\/","url_meta":{"origin":671,"position":3},"title":"Download counter for your website&#8217;s files","author":"Diogo Nunes","date":"23 June, 2014","format":false,"excerpt":"A download counter not only provides you useful metrics but also gives your visitors a hint about the most popular files. If you offer your visitors files to download you may want to count how many times each file is download. I use CCounter, a PHP Click Counter to count\u2026","rel":"","context":"In &quot;Technology&quot;","block_context":{"text":"Technology","link":"https:\/\/www.diogonunes.com\/blog\/category\/tech\/"},"img":{"alt_text":"","src":"https:\/\/i0.wp.com\/www.diogonunes.com\/blog\/wp-content\/uploads\/2014\/06\/smiirl-fliike-e1411919272213.jpg?fit=1200%2C501&ssl=1&resize=350%2C200","width":350,"height":200,"srcset":"https:\/\/i0.wp.com\/www.diogonunes.com\/blog\/wp-content\/uploads\/2014\/06\/smiirl-fliike-e1411919272213.jpg?fit=1200%2C501&ssl=1&resize=350%2C200 1x, https:\/\/i0.wp.com\/www.diogonunes.com\/blog\/wp-content\/uploads\/2014\/06\/smiirl-fliike-e1411919272213.jpg?fit=1200%2C501&ssl=1&resize=525%2C300 1.5x, https:\/\/i0.wp.com\/www.diogonunes.com\/blog\/wp-content\/uploads\/2014\/06\/smiirl-fliike-e1411919272213.jpg?fit=1200%2C501&ssl=1&resize=700%2C400 2x, https:\/\/i0.wp.com\/www.diogonunes.com\/blog\/wp-content\/uploads\/2014\/06\/smiirl-fliike-e1411919272213.jpg?fit=1200%2C501&ssl=1&resize=1050%2C600 3x"},"classes":[]},{"id":263,"url":"https:\/\/www.diogonunes.com\/blog\/installing-play-framework-2-1-on-windows\/","url_meta":{"origin":671,"position":4},"title":"Installing Play Framework 2.1 on Windows","author":"Diogo Nunes","date":"17 March, 2014","format":false,"excerpt":"The Play Framework is probably one of the few web frameworks that installs and works pretty well on Windows. I started web development with Django, but I had to learn Python and Django at the same time, and the documentation was not so good as they said it was. So\u2026","rel":"","context":"In &quot;Technology&quot;","block_context":{"text":"Technology","link":"https:\/\/www.diogonunes.com\/blog\/category\/tech\/"},"img":{"alt_text":"","src":"https:\/\/i0.wp.com\/www.diogonunes.com\/blog\/wp-content\/uploads\/2014\/03\/lets-play-1.png?fit=1143%2C431&ssl=1&resize=350%2C200","width":350,"height":200,"srcset":"https:\/\/i0.wp.com\/www.diogonunes.com\/blog\/wp-content\/uploads\/2014\/03\/lets-play-1.png?fit=1143%2C431&ssl=1&resize=350%2C200 1x, https:\/\/i0.wp.com\/www.diogonunes.com\/blog\/wp-content\/uploads\/2014\/03\/lets-play-1.png?fit=1143%2C431&ssl=1&resize=525%2C300 1.5x, https:\/\/i0.wp.com\/www.diogonunes.com\/blog\/wp-content\/uploads\/2014\/03\/lets-play-1.png?fit=1143%2C431&ssl=1&resize=700%2C400 2x, https:\/\/i0.wp.com\/www.diogonunes.com\/blog\/wp-content\/uploads\/2014\/03\/lets-play-1.png?fit=1143%2C431&ssl=1&resize=1050%2C600 3x"},"classes":[]},{"id":379,"url":"https:\/\/www.diogonunes.com\/blog\/set-up-your-rails-env\/","url_meta":{"origin":671,"position":5},"title":"Setting up your Rails environment from scratch","author":"Diogo Nunes","date":"12 May, 2014","format":false,"excerpt":"This is a complete yet summarized guide to set up a Ruby on Rails development environment on Linux. Installing and configuring Sublime Text, Github, and Heroku are optional but we're included for the sake of completeness. Since these are the de facto tools for editing source code, managing code repositories\u2026","rel":"","context":"In &quot;Technology&quot;","block_context":{"text":"Technology","link":"https:\/\/www.diogonunes.com\/blog\/category\/tech\/"},"img":{"alt_text":"original photo: goo.gl\/QE43FV","src":"https:\/\/i0.wp.com\/www.diogonunes.com\/blog\/wp-content\/uploads\/2014\/05\/rails-worker-assembly-construction.jpg?fit=620%2C230&ssl=1&resize=350%2C200","width":350,"height":200,"srcset":"https:\/\/i0.wp.com\/www.diogonunes.com\/blog\/wp-content\/uploads\/2014\/05\/rails-worker-assembly-construction.jpg?fit=620%2C230&ssl=1&resize=350%2C200 1x, https:\/\/i0.wp.com\/www.diogonunes.com\/blog\/wp-content\/uploads\/2014\/05\/rails-worker-assembly-construction.jpg?fit=620%2C230&ssl=1&resize=525%2C300 1.5x"},"classes":[]}],"jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/www.diogonunes.com\/blog\/wp-json\/wp\/v2\/posts\/671","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.diogonunes.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.diogonunes.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.diogonunes.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.diogonunes.com\/blog\/wp-json\/wp\/v2\/comments?post=671"}],"version-history":[{"count":1,"href":"https:\/\/www.diogonunes.com\/blog\/wp-json\/wp\/v2\/posts\/671\/revisions"}],"predecessor-version":[{"id":3566,"href":"https:\/\/www.diogonunes.com\/blog\/wp-json\/wp\/v2\/posts\/671\/revisions\/3566"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.diogonunes.com\/blog\/wp-json\/wp\/v2\/media\/1306"}],"wp:attachment":[{"href":"https:\/\/www.diogonunes.com\/blog\/wp-json\/wp\/v2\/media?parent=671"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.diogonunes.com\/blog\/wp-json\/wp\/v2\/categories?post=671"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.diogonunes.com\/blog\/wp-json\/wp\/v2\/tags?post=671"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}