<div dir="ltr"><div>Hi Paolo. Many thanks for the prompt response.</div><div><br></div><div>I'll try your suggestion of a custom django command, good idea :).</div><div><br></div><div>Thanks so much,<br></div><div>Sam</div><div><br></div><div><div><div dir="ltr" class="gmail_signature" data-smartmail="gmail_signature"><div dir="ltr"><div><div dir="ltr">---<br><div><font face="courier new, monospace">Sam Franklin</font></div></div></div></div></div></div><br></div></div><br><div class="gmail_quote"><div dir="ltr">On Tue, 27 Nov 2018 at 17:56, Paolo Corti <<a href="mailto:pcorti@gmail.com">pcorti@gmail.com</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Hi Sam<br>
<br>
1. I don't think you can POST to the API as looking at CommonMetaApi<br>
in geonode.api.resourcebase_api I see just 'GET' in allowed_methods<br>
2. I can provide you some help with this, but looking at 1. would you<br>
be still interested?<br>
3. I would create a django management command for this purpose -<br>
provided that you can access to the server to run the command. Another<br>
approach is by using SQL<br>
<br>
best<br>
Paolo<br>
On Tue, Nov 27, 2018 at 9:26 AM Sam Franklin <<a href="mailto:mr.samfranklin@gmail.com" target="_blank">mr.samfranklin@gmail.com</a>> wrote:<br>
><br>
> Hi List<br>
><br>
> 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>
><br>
> 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><br>
> I couldn't see a way to do this via the manage.py commandline application.<br>
> I didn't try a SQL insert/update approach, as thought the API route would be cleaner.<br>
><br>
> I attempted to construct a POST request (using POSTMAN).<br>
><br>
> 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" rel="noreferrer" target="_blank">https://localhost/api/layers/?id=39</a>. This demonstrates that I can perform GET requests to the "layers" endpoint from outside the browser.<br>
><br>
> When I manually edited a layer rating via the geonode UI, I intercepted this output from the apache access log.<br>
> "POST /ratings/54/39/rate/ HTTP/1.1" 200 609 "<a href="https://localhost/layers/geonode:mylayer" rel="noreferrer" target="_blank">https://localhost/layers/geonode:mylayer</a>" <user-agent><br>
><br>
> However, for a POST request (and adding a referer header) using URL <a href="https://localhost/ratings/54/39/rate/?rating=4" rel="noreferrer" target="_blank">https://localhost/ratings/54/39/rate/?rating=4</a>, I receive a 403 forbidden error which relates to the CSRF verification, see below pasted as plain text body of the django response.<br>
><br>
> So this is obviously an authentication issue.<br>
><br>
> However, taking a step back, my queries are:<br>
> 1. Are POST requests to the API possible at all from curl or postman or some other client?<br>
> 2. Is there any documentation on geonode API i.e. obtaining a CSRF token via the API?<br>
> 3. Is there a better approach to achieving editing metadata from the backend?<br>
><br>
> Thanks in advance for any pointers.<br>
> Sam<br>
><br>
> #### POST request error<br>
> 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>
> ####<br>
><br>
> _______________________________________________<br>
> geonode-users mailing list<br>
> <a href="mailto:geonode-users@lists.osgeo.org" target="_blank">geonode-users@lists.osgeo.org</a><br>
> <a href="https://lists.osgeo.org/mailman/listinfo/geonode-users" rel="noreferrer" target="_blank">https://lists.osgeo.org/mailman/listinfo/geonode-users</a><br>
<br>
<br>
<br>
-- <br>
Paolo Corti<br>
Geospatial software developer<br>
web: <a href="http://www.paolocorti.net" rel="noreferrer" target="_blank">http://www.paolocorti.net</a><br>
twitter: @capooti<br>
skype: capooti<br>
</blockquote></div>