{"componentChunkName":"component---src-templates-blog-post-js","path":"/blog/2019-09-01-django-get-requests/","result":{"data":{"markdownRemark":{"html":"<p>Hello!</p>\n<p>Let's say you want to send a <code class=\"language-text\">GET</code> request to a Django based server, and you want to use vanilla <code class=\"language-text\">JavaScript</code>. You don't want to use jQuery, nor any other framework.</p>\n<!-- more -->\n<h3>The HTML:</h3>\n<p>So, lets say you have a Django app called test_app, with a js script called \"get_example.js\" in its static folder.\nWe want the server to return a message when this button is clicked, so we write this index.html:</p>\n<div class=\"gatsby-highlight\" data-language=\"html\"><pre class=\"language-html\"><code class=\"language-html\"><span class=\"token doctype\"><span class=\"token punctuation\">&lt;!</span><span class=\"token doctype-tag\">DOCTYPE</span> <span class=\"token name\">html</span><span class=\"token punctuation\">></span></span>\n<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>html</span><span class=\"token punctuation\">></span></span>\n    <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>head</span><span class=\"token punctuation\">></span></span>\n        {% load static %}\n        <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>script</span> <span class=\"token attr-name\">src</span><span class=\"token attr-value\"><span class=\"token punctuation attr-equals\">=</span><span class=\"token punctuation\">'</span>{% static <span class=\"token punctuation\">\"</span>test_app/get_example.js<span class=\"token punctuation\">\"</span> %}<span class=\"token punctuation\">'</span></span> <span class=\"token attr-name\">defer</span><span class=\"token punctuation\">></span></span><span class=\"token script\"></span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>script</span><span class=\"token punctuation\">></span></span>\n        <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>title</span><span class=\"token punctuation\">></span></span>Test html<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>title</span><span class=\"token punctuation\">></span></span>\n    <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>head</span><span class=\"token punctuation\">></span></span>\n    <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>body</span><span class=\"token punctuation\">></span></span>\n        <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>button</span> <span class=\"token attr-name\">id</span><span class=\"token attr-value\"><span class=\"token punctuation attr-equals\">=</span><span class=\"token punctuation\">\"</span>test-button<span class=\"token punctuation\">\"</span></span><span class=\"token punctuation\">></span></span>Peter<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>button</span><span class=\"token punctuation\">></span></span>\n    <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>body</span><span class=\"token punctuation\">></span></span>\n<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>html</span><span class=\"token punctuation\">></span></span></code></pre></div>\n<p>I use the <code class=\"language-text\">defer</code> attribute here to make sure the script is run after the page has finished parsing. By using <code class=\"language-text\">defer</code>, we avoid having to wrap all the script in a <code class=\"language-text\">DOMContentLoaded</code> event listener.</p>\n<h3>The JavaScript:</h3>\n<p>Next, lets write the <strong>JavaScript</strong> code to listen for the click and to send the <code class=\"language-text\">GET</code> request. Let's say we want to ask the server for the last name associated to the first name that was in the button and replace the text in said button with it:</p>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\">document<span class=\"token punctuation\">.</span><span class=\"token function\">querySelector</span><span class=\"token punctuation\">(</span><span class=\"token string\">'#test-button'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function-variable function\">onclick</span> <span class=\"token operator\">=</span> <span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span>\n    <span class=\"token punctuation\">{</span>\n        awesome_name <span class=\"token operator\">=</span> document<span class=\"token punctuation\">.</span><span class=\"token function\">querySelector</span><span class=\"token punctuation\">(</span><span class=\"token string\">'#test-button'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span>innerHTML<span class=\"token punctuation\">;</span>\n        <span class=\"token keyword\">const</span> request_for_last_name <span class=\"token operator\">=</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">XMLHttpRequest</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n        request_for_last_name<span class=\"token punctuation\">.</span><span class=\"token function\">open</span><span class=\"token punctuation\">(</span><span class=\"token string\">'GET'</span><span class=\"token punctuation\">,</span> <span class=\"token string\">'users/who?fname='</span> <span class=\"token operator\">+</span> awesome_name<span class=\"token punctuation\">,</span> <span class=\"token boolean\">true</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n        request_for_last_name<span class=\"token punctuation\">.</span><span class=\"token function\">send</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n        request_for_last_name<span class=\"token punctuation\">.</span><span class=\"token function-variable function\">onload</span> <span class=\"token operator\">=</span> <span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span>\n        <span class=\"token punctuation\">{</span>\n            response_data <span class=\"token operator\">=</span> <span class=\"token constant\">JSON</span><span class=\"token punctuation\">.</span><span class=\"token function\">parse</span><span class=\"token punctuation\">(</span>request_for_last_name<span class=\"token punctuation\">.</span>responseText<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n            document<span class=\"token punctuation\">.</span><span class=\"token function\">querySelector</span><span class=\"token punctuation\">(</span><span class=\"token string\">'#test-button'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span>innerHTML <span class=\"token operator\">=</span> <span class=\"token string\">\"Last name: \"</span> <span class=\"token operator\">+</span> response_data<span class=\"token punctuation\">.</span>lname<span class=\"token punctuation\">;</span>\n        <span class=\"token punctuation\">}</span><span class=\"token punctuation\">;</span>\n    <span class=\"token punctuation\">}</span><span class=\"token punctuation\">;</span></code></pre></div>\n<p>The key here is <code class=\"language-text\">&#39;users/who?fname=&#39; + awesome_name</code> part.</p>\n<p>We will use the route <code class=\"language-text\">users/who</code> for Django to be able to associate our request to the Python code to run via the <strong>urls.py</strong> file.</p>\n<p>With <code class=\"language-text\">?fname=</code> we are saying that we will be sendind data called \"fname\" in this request.</p>\n<p>Then, <code class=\"language-text\">+ awesome_name</code> puts the value of the awesome_name variable to the request as the value of \"fname\".</p>\n<p>So, when we clic the button, that GET request will be sent to <code class=\"language-text\">users/who?fname=Peter</code>.</p>\n<h3>The Python:</h3>\n<p>The Python code for the Django <strong>urls.py</strong> file should be something like:</p>\n<div class=\"gatsby-highlight\" data-language=\"python\"><pre class=\"language-python\"><code class=\"language-python\"><span class=\"token keyword\">from</span> django<span class=\"token punctuation\">.</span>urls <span class=\"token keyword\">import</span> path\n\n<span class=\"token keyword\">from</span> <span class=\"token punctuation\">.</span> <span class=\"token keyword\">import</span> views\n\nurlpatterns <span class=\"token operator\">=</span> <span class=\"token punctuation\">[</span>\n    path<span class=\"token punctuation\">(</span><span class=\"token string\">\"\"</span><span class=\"token punctuation\">,</span> views<span class=\"token punctuation\">.</span>example<span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span>\n    path<span class=\"token punctuation\">(</span><span class=\"token string\">\"users/who\"</span><span class=\"token punctuation\">,</span> views<span class=\"token punctuation\">.</span>get_last_name_view<span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">]</span></code></pre></div>\n<p>Note that we wrote <code class=\"language-text\">users/who</code>. That way, when we fire the request, Django will match the adress in it and run the get<em>last</em>name_view function in our views.py file. Note that you can use regular expression (regex) patterns for the path instead.</p>\n<p>Side note: it is important to differentiate the paths of diferent kinds GET requests (especially when using regex): if you have for example two differet urlpatterns that Django understands as similar to the adress on your request, it will trigger the first one that matches.</p>\n<p>Finally the Python code for the Django <strong>views.py</strong> file:</p>\n<div class=\"gatsby-highlight\" data-language=\"python\"><pre class=\"language-python\"><code class=\"language-python\"><span class=\"token keyword\">from</span> django<span class=\"token punctuation\">.</span>shortcuts <span class=\"token keyword\">import</span> render\n<span class=\"token keyword\">from</span> django<span class=\"token punctuation\">.</span>http <span class=\"token keyword\">import</span> JsonResponse\n\n<span class=\"token keyword\">def</span> <span class=\"token function\">example</span><span class=\"token punctuation\">(</span>request<span class=\"token punctuation\">)</span><span class=\"token punctuation\">:</span>\n    <span class=\"token keyword\">return</span> render<span class=\"token punctuation\">(</span>request<span class=\"token punctuation\">,</span> <span class=\"token string\">\"test_app/index.html\"</span><span class=\"token punctuation\">)</span>\n\n<span class=\"token keyword\">def</span> <span class=\"token function\">get_last_name_view</span><span class=\"token punctuation\">(</span>request<span class=\"token punctuation\">)</span><span class=\"token punctuation\">:</span>\n    fname <span class=\"token operator\">=</span> request<span class=\"token punctuation\">.</span>GET<span class=\"token punctuation\">.</span>get<span class=\"token punctuation\">(</span><span class=\"token string\">'fname'</span><span class=\"token punctuation\">)</span>\n    response_data <span class=\"token operator\">=</span> <span class=\"token punctuation\">{</span><span class=\"token punctuation\">}</span>\n    <span class=\"token keyword\">if</span> fname <span class=\"token operator\">==</span> <span class=\"token string\">\"Peter\"</span><span class=\"token punctuation\">:</span>\n        response_data<span class=\"token punctuation\">[</span><span class=\"token string\">'lname'</span><span class=\"token punctuation\">]</span> <span class=\"token operator\">=</span> <span class=\"token string\">\"Pan\"</span>\n    <span class=\"token keyword\">else</span><span class=\"token punctuation\">:</span>\n        response_data<span class=\"token punctuation\">[</span><span class=\"token string\">'lname'</span><span class=\"token punctuation\">]</span> <span class=\"token operator\">=</span> <span class=\"token string\">\"Not found\"</span>\n    <span class=\"token keyword\">return</span> JsonResponse<span class=\"token punctuation\">(</span>response_data<span class=\"token punctuation\">,</span> safe<span class=\"token operator\">=</span><span class=\"token boolean\">False</span><span class=\"token punctuation\">)</span></code></pre></div>\n<p>In this example, the else statement will never be run. But I like to be explicit about if statements.</p>\n<p>Here, in <code class=\"language-text\">fname=request.GET.get(&#39;fname&#39;)</code>, we take the value of <code class=\"language-text\">fname</code> sent in the request, and assign it to the fname Python variable.\nNext, we check if it is 'Peter' and if so, we put the last name 'Pan' in a response_data dictionary that we finally return with JsonResponse (with the key \"lname\").</p>\n<p>That way, our JavasCript code can access this information once we parse the response with <code class=\"language-text\">JSON.parse</code> as shown above.</p>\n<p>Cheers, have a good one!</p>","frontmatter":{"title":"Sending AJAX GET requests to a Django server without jQuery","date":"September 2nd, 2019","icon":"☕️"},"fields":{"readingTime":{"text":"3 min read"}}}},"pageContext":{"slug":"/2019-09-01-django-get-requests/"}},"staticQueryHashes":["143701507","588331372"]}