{"id":3184,"date":"2013-10-30T13:06:55","date_gmt":"2013-10-30T12:06:55","guid":{"rendered":"http:\/\/www.thetawelle.de\/?p=3184"},"modified":"2021-05-21T22:20:24","modified_gmt":"2021-05-21T21:20:24","slug":"django-some-first-impressions","status":"publish","type":"post","link":"https:\/\/www.thetawelle.de\/?p=3184","title":{"rendered":"django &#8211; some first impressions"},"content":{"rendered":"<div style=\"float:right;width:350px;background-color:lightgray;margin-left:10px;margin-bottom:5px;background:transparent linear-gradient(270deg,#ec9b5f,#fdd45e 52%,#fbe57e) 0 0 no-repeat padding-box;padding:3px;color:white;font-family:canada-type-gibson,sans-serif!important;text-align:center;border-radius:5px;\">\nIf you would like to learn this stuff the professional way, you may try&#8230;<br \/>\n<a href=\"https:\/\/jobtensor.com\/Tutorial\/Python\/en\/Introduction\"><img decoding=\"async\" style=\"border:none;display:inline;\" src=\"https:\/\/jobtensor.com\/img\/python-tutorials\/jumbotron-python.svg\" class=\"img img-fluid\" alt=\"Python\"><\/a><\/p>\n<h3>Get into Python<\/h3>\n<p>Get started learning Python with our Python Tutorial. This tool is intended for everyone who wants to learn Python programming language, whether your are a beginner or already a pro.<\/p>\n<p><a style=\"height:40px;background-color:#222;color:#ec9b5f;font-weight:bold;padding-left:40px;padding-right:40px;border:none;border-radius:20px;margin-top:30px;margin-bottom:30px;\" href=\"https:\/\/jobtensor.com\/Tutorial\/Python\/en\/Introduction\">TRY IT&#8230;<\/a>\n<\/div>\n<p><a href=\"\/wp-upload\/django-logo.png\"><img loading=\"lazy\" decoding=\"async\" data-id=\"3050\"  src=\"\/wp-upload\/django-logo.png\" alt=\"django-logo\" width=\"250\" height=\"121\" class=\"alignright size-full wp-image-3050\" \/><\/a>Since I mastered the setup of my apache config to actually find my django project I experience some more fluent development happening.<\/p>\n<p>Actually I learned already a lot about the powerful namespacing pattern for URLs which frees up a lot of capacity you usually spend on fixing broken link experiences for users and wrapping your head around url-paths.<\/p>\n<p>Actually the url-handling via regex is a bit painful at first, but it turns out that this gives you extraordinary flexibility to create wonderfully simple and elegant looking urls which is a thing nowadays if you wanna be found in Google at the top ranks and provide useful permalinks e.g. for products whoich should be found easily.<\/p>\n<p>Also the template engine is very flexible. I can create a kind of loopholes (called blocks) in my base templates to prepare them to get stuff injected from lower level templates which is great. You could build a very complex site in no time and have things like header, navigation, content, footer easily setup and look consistently.<\/p>\n<h3>Learning with the best tutorials<\/h3>\n<p>After I did the <a href=\"https:\/\/docs.djangoproject.com\/en\/1.5\/intro\/tutorial01\/\">painful 6-part tutorial<\/a>, I just did another <a href=\"http:\/\/www.youtube.com\/playlist?list=PL313A26329E0C8900\">very good tutorial on youtube<\/a> (and still executing on it). And boy was I happy to actually have learned things the &#8222;right way&#8220; before. because in the youtube based tutorial above the guy explaining stuff there totally misses on the concept of url-namespacing. But see for yourself here:<br \/>\n<center><br \/>\n<iframe loading=\"lazy\" width=\"550\" height=\"360\" src=\"\/\/www.youtube.com\/embed\/yAyWM-iEIos?feature=player_detailpage\" frameborder=\"0\" allowfullscreen><\/iframe><br \/>\n<small><strong>Source:<\/strong> Django Full Website Tutorial by <a href=\"http:\/\/hackedexistence.com\/\">hackedexistence.com<\/a><\/small><\/center><\/p>\n<p><strong>If you know some excellent tutorials<\/strong>, e.g. on how to setup django for SSL-based deployment and the like, <strong>let me know<\/strong> in the comments.<\/p>\n<p>I also found <strong>some very helpful other links<\/strong>:<\/p>\n<ul>\n<li><a href=\"http:\/\/hackedexistence.com\/project\/django\/video1-configuration.html\">Django Tutorial Part 1 of 13 on Youtube<\/a><\/li>\n<li><a href=\"https:\/\/github.com\/refreshoxford\/django-cbv-inspector\/\">Class Based Views Inspector<\/a> to create a <a href=\"http:\/\/ccbv.co.uk\/projects\/Django\/1.5\/\">MUCH better documentation from djangos<\/a> classes<\/li>\n<li><a href=\"http:\/\/ccbv.co.uk\/projects\/Django\/1.5\/\">Nice Django 1.5 documentation<\/a><\/li>\n<li><a href=\"http:\/\/www.pythonware.com\/products\/pil\/#pil117\">Python Imaging Library<\/a> which is needed to handle images<\/li>\n<li>Another <a href=\"http:\/\/www.youtube.com\/watch?v=D0MoGRZRtcA\">great tutorial (video)<\/a> by <strong>Michael Herman<\/strong> who also documented the tutorial materials on <a href=\"http:\/\/realdjango.herokuapp.com\">realdjango.herokuapp.com<\/a><\/li>\n<\/ul>\n<h3>Python tricks often appreciated<\/h3>\n<p>During all my tinkering I also did used a lot of really useful operations using the <code>manage.py<\/code> command. E.g. today I just wiped my database to try repopulating it with stuff I dumped before. It was quite easy and which is good to have for experimenting and not loosing all your data. Just <strong>be careful<\/strong> you do not change the DB-scheme during these operations.<\/p>\n<p><code><br \/>\npython manage.py dumpdata <your_app> > temp_data.json<br \/>\npython manage.py flush <your_app><br \/>\npython manage.py loaddata temp_data.json<br \/>\n<\/code><\/p>\n<p>I also made a lot of use of following command:<br \/>\n<code><br \/>\npython manage.py shell<br \/>\n<\/code><br \/>\nThis loads the whole project or in a way has all the settings needed setup for you. Some quick<br \/>\n<code><br \/>\n>>> from &lt;myApp&gt;.models import &lt;myEntity&gt;<br \/>\n>>> dir(&lt;myEntity&gt;)<br \/>\n<\/code><br \/>\nGave me really helpful insights, what the object I have actually is capable of doing, by displaying all the methods and attributes available.<\/p>\n<p>My bootstrapping file for Vagrant now was extended by a lot of useful stuff, but actually I did not destroy my VM recently so if all this works will be seen on the next setup of my VM using <code>vagrant up<\/code>.<\/p>\n<p>Content I added to my <strong>bootstrap.sh<\/strong> file:<br \/>\n<code><br \/>\n# SETUP FOR BOOTSTRAPPING<br \/>\napt-get update<\/p>\n<p># INSTALL apache<br \/>\napt-get install -y apache2<\/p>\n<p># INSTALL mod_wsgi<br \/>\napt-get install libapache2-mod-wsgi<\/p>\n<p># INSTALL django<br \/>\napt-get install -y python-django<\/p>\n<p># INSTALL python imaging library<br \/>\napt-get install python-imaging python-imaging-tk<\/p>\n<p># INSTALL postgres & python db connector<br \/>\napt-get install postgresql python-psycopg2<br \/>\n<\/code><\/p>\n<p>I also backed up my apache config files now to some place external to the VM (shared folder) so I do not loose all config stuff if I destroy the VM.<\/p>\n<h3>Further education<\/h3>\n<p>To gain some flexibility for my models I just started reading stuff like e.g. <a href=\"http:\/\/elweb.co\/33-projects-that-make-developing-django-apps-awesome\/\">&#8222;33 projects that make developing django apps awesome&#8220;<\/a> and <a href=\"http:\/\/www.djangopro.com\/2011\/01\/django-database-migration-tool-south-explained\/\">&#8222;Django database migration tool: south, explained&#8220;<\/a>.<\/p>\n<p><a href=\"\/wp-upload\/south_logo.png\"><img loading=\"lazy\" decoding=\"async\" data-id=\"3193\"  src=\"\/wp-upload\/south_logo.png\" alt=\"south_logo\" width=\"210\" height=\"70\" class=\"alignright size-full wp-image-3193\" \/><\/a><a href=\"http:\/\/south.aeracode.org\/\"><strong>South<\/strong><\/a> (start <a href=\"http:\/\/south.aeracode.org\/wiki\/Tutorial1\">Tutorial here<\/a>) looks like an elegant solution for my purposes because it provides intelligent schema and data migrations.<\/p>\n<p>The plain vanilla way to do migrations would be Django&#8217;s <a href=\"http:\/\/code.google.com\/p\/django-evolution\/\">Evolution<\/a>. But <a href=\"https:\/\/code.djangoproject.com\/wiki\/SchemaEvolution\">even they<\/a> point out that South has become a <strong>De facto standard<\/strong>. Looks like some stuff was inspired by <a href=\"http:\/\/api.rubyonrails.org\/classes\/ActiveRecord\/Migration.html\">ActiveRecord<\/a> from rails.<\/p>\n<p>So some line of<br \/>\n<code>sudo apt-get install python-django-south<\/code><br \/>\njust made it fly. I like the ubuntu way of installing software&#8230; just to revert the action using<br \/>\n<code>sudo apt-get remove --purge python-django-south<\/code><br \/>\nseveral minutes later because south was not correctly installed and better should have been installed through using pip.<\/p>\n<p>So doing a <code>sudo pip install south<\/code> to get the e x a c t  same result. So must be some other error. Doing some googleing on that one&#8230; turns out south <a href=\"http:\/\/stackoverflow.com\/questions\/4218496\/django-south-fresh-install-error-unknown-command-schemamigration\">needs to be entered in the INSTALLED_APPS<\/a> entry in the settings.py&#8230; nice that you find that on the documentation so easily. So this stackoverflow-line helped me out again:<\/p>\n<blockquote><p>You probably haven&#8217;t added &#8217;south&#8216; into the list of INSTALLED_APPS of your settings.py file<\/p><\/blockquote>\n<p>But at least I now know the exact version of south installed. It&#8217;s 0.8.2 the one installed by <strong>apt-get<\/strong> was only 0.7.3, so I guess pip is the better way to fly. And now python manage.py did show:<br \/>\n<code><br \/>\n[south]<br \/>\n    convert_to_south<br \/>\n    datamigration<br \/>\n    graphmigrations<br \/>\n    migrate<br \/>\n    migrationcheck<br \/>\n    schemamigration<br \/>\n    startmigration<br \/>\n    syncdb<br \/>\n    test<br \/>\n    testserver<br \/>\n<\/code><\/p>\n<p><strong>Fine!<\/strong> Now that I got that installed the <code>python manage.py syncdb<\/code> changed its output to some new formatting which involves some south-magic. It now looks like:<br \/>\n<code><br \/>\nSyncing...<br \/>\nCreating tables ...<br \/>\nCreating table south_migrationhistory<br \/>\nInstalling custom SQL ...<br \/>\nInstalling indexes ...<br \/>\nInstalled 0 object(s) from 0 fixture(s)<\/p>\n<p>Synced:<br \/>\n &gt; django.contrib.auth<br \/>\n &gt; django.contrib.contenttypes<br \/>\n &gt; django.contrib.sessions<br \/>\n &gt; django.contrib.sites<br \/>\n &gt; django.contrib.messages<br \/>\n &gt; django.contrib.staticfiles<br \/>\n &gt; django.contrib.admin<br \/>\n &gt; south<br \/>\n &gt; shop<br \/>\n &gt; shopadmin<br \/>\n &gt; tinymce<\/p>\n<p>Not synced (use migrations):<br \/>\n -<br \/>\n(use .\/manage.py migrate to migrate these)<br \/>\n<\/code><\/p>\n<p>I just coninued to put my models under migration control using:<br \/>\n<code>python manage.py schemamigration &lt;myapp&gt; --initial<\/code><br \/>\n<strong>Worked!<\/strong> But everything after that failed. Even a <strong>flush<\/strong> on the database did not help in any way. Hmm&#8230;<br \/>\nAdding south to an existing project needs special handling&#8230;<br \/>\n<code>python manage.py convert_to_south &lt;myApp&gt;<\/code><br \/>\nalso learned that deleting the migrations directory is not that evil after all if <strong>&#8222;things go south&#8220;<\/strong>, haha.<\/p>\n<h3>Migrations on the server<\/h3>\n<p>At the same time I learned that there is <a href=\"http:\/\/stackoverflow.com\/questions\/4035296\/adding-south-to-django-project-development-production\">a procedure<\/a> for handling migrations perfectly on the server, its like this:<\/p>\n<ol>\n<li>Install South on server. import south from shell just to make sure you are using the same python env.\n<li>Add &#8217;south&#8216; to INSTALLED_APPS in settings.py<\/li>\n<li>Upload settings.py<\/li>\n<li>Restart (web)server<\/li>\n<li><code>python manage.py syncdb<\/code>\n<li>Upload new app\/models.py and app\/migrations\/ dir<\/li>\n<li>Restart (web)server<\/li>\n<li><code>python manage.py migrate app --fake 0001<\/code><\/li>\n<li><code>python manage.py migrate app<\/code><\/li>\n<\/ol>\n<p><strong>Good to know!<\/strong> Since I got some changes to my models waiting, I changed them now and handed over to south:<br \/>\n<code><br \/>\npython manage.py schemamigration myproject.myapp --auto<br \/>\npython manage.py migrate myproject.myapp<br \/>\n<\/code><br \/>\nWorked like a charme&#8230; after fixing some modelissues (adding null=True) and providing default values for some Decimals. Great!<\/p>\n<p>Oh and if you have permission problems with your webserver directory in your VM managed by Vagrant, try adding following line in the <strong>Vagrantfile<\/strong>:<br \/>\n<code>config.vm.synced_folder \".\/\", \"\/vagrant\", :owner=> 'vagrant', :group=> 'www-data', :mount_options => ['dmode=775', 'fmode=775']<\/code><br \/>\nThis adds the directory to the group of the apache-users, so apache is allowed to write into those files. Here it is <code>www-data<\/code>-group but it may be different for your VM\/Webserver combination.<\/p>\n<h3>Localization<\/h3>\n<p>Today I tried to use translated strings in my templates e.g. using following statement in one template<br \/>\n<code>{% trans 'Willkommen auf meiner Homepage.' %}<\/code><br \/>\nyou need to add<br \/>\n<code>{% load i18n %}<\/code> at the top of each template file and below any base-template statements.<br \/>\nusing <code>django-admin.py makemessages -l de --all<\/code><br \/>\nI tried to create localizationfiles for my app. But that did not really work because I needed to create <code>locale<\/code>-dirs first in my project.<br \/>\nAnd then I got the famous error:<br \/>\n<span style=\"color:red;\">CommandError: Error running xgettext. Note that Django internationalization requires GNU gettext 0.15 or newer.<\/span><br \/>\nwhich I fixed using the ubuntu SW installation manager by typing<br \/>\n<code>sudo apt-get install gettext<\/code><br \/>\nand adding it to the <strong>bootstrap.sh<\/strong> for my VM.<\/p>\n<p>Then after entering<br \/>\n<code>django-admin.py makemessages -l de --all<\/code><br \/>\nwhich created a <strong>.po-file<\/strong> in my project<br \/>\n<code>locale\/de\/LC_MESSAGES\/django.po<\/code><br \/>\nRepeating the same procedure for english language revealed another folder for en. But&#8230;<br \/>\nthat alone was not sufficient by far. You need to do a <strong>compile<\/strong> on the locale files before you even have a chance of seeing translation happen.<br \/>\n<code>django-admin.py compilemessages<\/code> and in my case<br \/>\nI also needed to add the LOCALE_PATHS to actually find my locale dir in the project, i have no clue why it does not find that automatically as advertised.<\/p>\n<h3>Authentication and sending mails<\/h3>\n<p>In the meantime I implemented registration\/login\/logout and user profile. Following my tutorials I just took django&#8217;s default implementation of how to reset passwords for user accounts. That&#8217;s when I hit the next wall. But that was really an easy one. If you want to send mails you need a mailserver. After <a href=\"http:\/\/stackoverflow.com\/questions\/5802189\/django-errno-111-connection-refused\">some googeling<\/a> i went with postfix for testing:<br \/>\n<code>sudo apt-get install postfix<\/code><br \/>\nmade this work, otherwise I saw an error which pointed me directly towards the problem. I need to remember this for deployment to actually install a maiserver which is stable and configure it in the <strong>settings.py<\/strong> according to <a href=\"https:\/\/docs.djangoproject.com\/en\/dev\/ref\/settings\/#email-host\">this<\/a> and <a href=\"https:\/\/docs.djangoproject.com\/en\/1.3\/topics\/email\/\">this<\/a> and during development maybe <a href=\"https:\/\/docs.djangoproject.com\/en\/1.3\/topics\/email\/#testing-e-mail-sending\">this<\/a>.<\/p>\n<p>Actually I would prefer to just setup the following settings:<br \/>\n<code><br \/>\nEMAIL_HOST = 'localhost'<br \/>\nEMAIL_PORT = 1025<br \/>\n<\/code><\/p>\n<p>and then type<br \/>\n<code>python -m smtpd -n -c DebuggingServer localhost:1025<\/code><br \/>\nthis prints emails which are normally sent via any configured mailserver to the console to debug its content and headers. Very useful!!!<\/p>\n<p>Other useful stuff I discovered during my voyage&#8230; (basically I just store all the open tabs on my browser here, because I need to reboot the machine for some hardware driver I need to install which needs a reboot of my mac.)<\/p>\n<ul>\n<li><a href=\"http:\/\/lukeplant.me.uk\/blog\/posts\/djangos-cbvs-were-a-mistake\/\">Some criticism of the ClassBasedView-model<\/a>\n<li><a href=\"http:\/\/php.net\/manual\/de\/function.strftime.php\">Date\/time formatting symbols for strftime-lib<\/a>\n<li><a href=\"http:\/\/docs.python.org\/3\/\"> Python v3.3.2 documentation (future)<\/a>\n<li><a href=\"http:\/\/www.deploydjango.com\/\">Deploy Django (kind of a book)<\/a>\n<li><a href=\"https:\/\/docs.djangoproject.com\/en\/dev\/howto\/deployment\/wsgi\/modwsgi\/\">How to use Django with Apache and mod_wsgi <\/a>\n<li><a href=\"http:\/\/docs.python-guide.org\/en\/latest\/dev\/env\/#ides\">List of python IDE&#8217;s<\/a>\n<li><a href=\"http:\/\/docs.python.org\/2\/library\/stdtypes.html#string-formatting\">Standard String Formatters for python data types<\/a>\n<li><a href=\"https:\/\/pypi.python.org\/pypi\">PyPI &#8211; the Python Package Index<\/a>\n<li><a href=\"https:\/\/docs.djangoproject.com\/en\/1.5\/intro\/reusable-apps\/\">The Advanced Tutorial I should start on next&#8230;<\/a>\n<li><a href=\"https:\/\/docs.djangoproject.com\/en\/1.5\/ref\/class-based-views\/\">Class-based views API reference<\/a>\n<li><a href=\"https:\/\/docs.djangoproject.com\/en\/1.5\/topics\/db\/queries\/\">How to query for objects in django<\/a>\n<li><a href=\"http:\/\/www.realpython.com\/\">&#8218;RealPython&#8216;<\/a> which looks like&#8230; mmmmmh &#8218;dnt know&#8230;\n<\/ul>\n<p>Wow, the new device driver fixed my issue with this gaming mouse. The default behaviour of the <strong><a href=\"http:\/\/www.cyborggaming.com\/prod\/rat9.htm\">Cyborg R.A.T. 9<\/a><\/strong> mouse is really pretty ugly. Have a look at <a href=\"http:\/\/www.cyborggaming.com\/blog\/post\/2011\/09\/07\/Mac-software-updated.aspx\">this enormous proof<\/a> of how MadCatz actually doesn&#8217;t even care about any Mac customer. Actually you should not buy anything from a company which behaves silly as this. It renders your mousepointer nearly useless. Since Cyborg did never provide any fix for the missing OS X driver and installing the <a href=\"http:\/\/www.cyborggaming.com\/macdriver\/\">old driver<\/a> for OS X 10.6 renders completely crazy issues with the mouse&#8230; I went with <strong><a href=\"http:\/\/www.usboverdrive.com\/\">USB Overdrive<\/a><\/strong> now. And wow it seems to fix the issues. I cannot manipulate the 3 different setups of the mouse, but I can pretty much freely configure any other button and all scrollwheels now. Great thanks to USB Overdrive! <strong>BTW: <\/strong><a href=\"http:\/\/mac.appstorm.net\/reviews\/utilities\/superpower-your-macs-peripherals-with-usb-overdrive\/\">here is a great review of USB Overdrive.<\/a><\/p>\n<h3>Taking a REST<\/h3>\n<p>Today I started opening up my small website using some <strong>REST API<\/strong>. I started installing necessary stuff following instructions <a href=\"http:\/\/django-rest-framework.org\/\">over here<\/a> by typing:<br \/>\n<code><br \/>\nsudo pip install djangorestframework<br \/>\nsudo pip install markdown<br \/>\nsudo pip install django-filter<br \/>\n<\/code><\/p>\n<p><strong>Wow!!!! Blown away just another time! REST-API support in actually no time. Haha, how cool is that?<\/strong><\/p>\n<p>By working my way through the tutorial on <a href=\"http:\/\/django-rest-framework.org\/tutorial\/1-serialization.html\">how to JSONify stuff<\/a>, I created my own <code>apiviews.py<\/code> (I did not want that API stuff in my regular views) and then I just setup the urls.py with som additional info. (meanwhile I found myself trying to close a browser tab by typing <code>:q<\/code> in the window, perhaps it is time for <a href=\"https:\/\/addons.mozilla.org\/de\/firefox\/addon\/vimperator\/\">vimperator<\/a>&#8230;). I used the python interactive shell to actually experiment with the stuff in the tutorial. Which is really perfect to get to know the details of how JSONParser and JSONRenderer actually work, i.e. using a stream created with StringIO.<\/p>\n<p>So in the end this took me just one day to grab the concept of JSON-api-ifying my django app to get at least a stable READ-ONLY api. But now I will go on and work on the READ,CREATE,WRITE,DELETE stuff which will involve some validations of incoming JSON and objects created. We will see&#8230;<\/p>\n<p><strong>BTW:<\/strong> Meanwhile I just found another nice <a href=\"http:\/\/www.youtube.com\/watch?v=bRnm8f6Wavk\">Video Tutorial on the Python\/Django<\/a> stuff. Looks also very clear in its explanations and also provides some much better input about the background of how django works. So definitely worth a try, though the guy smartly &#8222;skips&#8220; (edited out of the video) several very delicate things (like installing the mySQL amd mysql-python, haha).<\/p>\n<p><strong>Update<\/strong><br \/>\nTo make my own experience on video-tutorials as comfortable as possible I just <a href=\"http:\/\/www.noxymo.com\/filespublic\/django_tutorial.html\">hacked myself a website<\/a> for one of the tutorial series. It allows to insert any video-id from youtube and will allow free resizing of the video display. Also I preprogrammed the HackedExistence ID&#8217;s for you already. So convenience is just 1 click away.<\/p>\n<p><em>To be continued&#8230;<\/em><\/p>\n","protected":false},"excerpt":{"rendered":"<p>If you would like to learn this stuff the professional way, you may try&#8230; Get into Python Get started learning Python with our Python Tutorial. This tool is intended for everyone who wants to learn Python programming language, whether your are a beginner or already a pro. TRY IT&#8230; Since I mastered the setup of &hellip; <a href=\"https:\/\/www.thetawelle.de\/?p=3184\" class=\"more-link\"><span class=\"screen-reader-text\">\u201edjango &#8211; some first impressions\u201c <\/span>weiterlesen<\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[88,93,67,9,92],"tags":[],"class_list":["post-3184","post","type-post","status-publish","format-standard","hentry","category-coding","category-django","category-english","category-studien","category-python"],"_links":{"self":[{"href":"https:\/\/www.thetawelle.de\/index.php?rest_route=\/wp\/v2\/posts\/3184","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.thetawelle.de\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.thetawelle.de\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.thetawelle.de\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.thetawelle.de\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=3184"}],"version-history":[{"count":0,"href":"https:\/\/www.thetawelle.de\/index.php?rest_route=\/wp\/v2\/posts\/3184\/revisions"}],"wp:attachment":[{"href":"https:\/\/www.thetawelle.de\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=3184"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.thetawelle.de\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=3184"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.thetawelle.de\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=3184"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}