<div dir="ltr"><div dir="ltr"><div dir="ltr"><div dir="ltr"><div dir="ltr"><div dir="ltr"><div>Hi List</div><div><br></div><div>I want to edit the metadata of layers on geonode programmatically e.g. abstracts and ratings fields. One example is that I want to bulk update data abstracts for many uploaded layers.<br></div><div><br></div><div>I'm not sure of the best approach, so I tried using an HTTP POST request to the genode api, e.g. localhost/api/<some-endpoint></div><div></div><div></div><div>I couldn't see a way to do this via the manage.py commandline application.</div><div></div><div>I didn't try a SQL insert/update approach, as thought the API route would be cleaner.</div><div><br></div><div>I attempted to construct a POST request (using POSTMAN).</div><div><br></div><div>
Using a postman GET request and adding a valid sessionid cookie, I'm 
able to query a given layer (e.g. id=39) and get a JSON response of all 
the metadata using URL (get) <a href="https://localhost/api/layers/?id=39">https://localhost/api/layers/?id=39</a>. This 
demonstrates that I can perform GET requests to the "layers" endpoint 
from outside the browser.

</div><div><br></div><div>When I manually edited a layer rating via the geonode UI, I intercepted this output from the apache access log.<br></div><div>"POST /ratings/54/39/rate/ HTTP/1.1" 200 609 "<a href="https://localhost/layers/geonode:mylayer" target="_blank">https://localhost/layers/geonode:mylayer</a>" <user-agent></div><div></div><div><br></div><div></div><div>However, for a POST request (and adding a referer header) using URL <span style="color:rgb(80,80,80);font-family:OpenSans,Helvetica,Arial,sans-serif;font-size:12px;font-style:normal;font-variant-ligatures:normal;font-variant-caps:normal;font-weight:normal;letter-spacing:normal;text-align:left;text-indent:0px;text-transform:none;white-space:pre-wrap;word-spacing:0px;background-color:rgb(255,255,255);text-decoration-style:initial;text-decoration-color:initial;display:inline;float:none"><a href="https://localhost/ratings/54/39/rate/?rating=4">https://localhost/ratings/54/39/rate/?rating=4</a></span>, I receive a 403 forbidden error which relates to the CSRF verification, see below pasted as plain text body of the django response.</div><div><br></div><div>So this is obviously an authentication issue.</div><div><br></div><div>However, taking a step back, my queries are:<br></div><div>1. Are POST requests to the API possible at all from curl or postman or some other client?<br></div><div></div><div>2. Is there any documentation on geonode API i.e. obtaining a CSRF token via the API?<br></div><div>3. Is there a better approach to achieving editing metadata from the backend?</div><div><br></div><div>Thanks in advance for any pointers.<br></div><div>Sam<br></div><div><br></div><div><b>#### POST request error</b><br></div><div>Forbidden (403)<br>CSRF verification failed. Request aborted.<br>Help<br>Reason given for failure:<br>    CSRF token missing or incorrect.<br>    <br>In general, this can occur when there is a genuine Cross Site Request Forgery, or when Django's CSRF mechanism has not been used correctly. For POST forms, you need to ensure:<br>Your browser is accepting cookies.<br>The view function passes a request to the template's render method.<br>In the template, there is a {% csrf_token %} template tag inside each POST form that targets an internal URL.<br>If you are not using CsrfViewMiddleware, then you must use csrf_protect on any views that use the csrf_token template tag, as well as those that accept the POST data.<br>You're seeing the help section of this page because you have DEBUG = True in your Django settings file. Change that to False, and only the initial error message will be displayed.<br>You can customize this page using the CSRF_FAILURE_VIEW setting.<br></div><div>
<b>####

</b></div><div><br></div></div></div></div></div></div></div>