[QGIS-Developer] QGIS Server accessing QgsProject

David Marteau dmarteau at 3liz.com
Mon Mar 31 14:15:11 PDT 2025


Afaik, there is no way to access the project in the `onRequestReady()` 
because you may change or set the targeted project  at this point before 
passing the request
to subsequent filters.

One possibility to get around this is to use the filter to route your 
request to a custom service implementation where it will be have access 
the project as an input parameter of the `executeRequest` method.

You may have a look to the  The AtlasPrint plugin 
(https://github.com/3liz/qgis-atlasprint) use that use this method for 
his custom `getatlasprint` implementation.

Your custom service, may then call  the native `getprint` request 
directly with the WMS  service handler 
(https://qgis.org/pyqgis/3.42/server/QgsService.html) and the service 
registry (https://qgis.org/pyqgis/3.42/server/QgsServiceRegistry.html)

Imho, you shouldn't rely on the QgsProject::instance() when implementing 
plugin filters, which may lead to undefined behaviors in some cases. If 
you need to acces the
project, prefer a custom service implementation where you get the 
project as an input parameter of the `executeRequest` method.

David Marteau

Le 31/03/2025 à 22:05, Ricardo Filipe Soares Garcia da via 
QGIS-Developer a écrit :
> Hi all
>
> I am implementing a custom plugin for QGIS Server that uses a 
> QgsServerFilter subclass.
>
> The purpose of this plugin is to use QGIS Server to respond to 
> `GetPrint` requests. However, I need to pass some runtime parameters 
> to my map layout before handing it over to `GetPrint`.
>
> I think the place where I should do these preparatory steps, which 
> ultimately include loading some layers and setting some layout 
> variables, is in my `onRequestReady()` method.
>
> The problem: I need to be able to set properties on the relevant 
> QgsPrintLayout instance, but in order to do that I would need to 
> retrieve it from the current QgsProject instance, and I can't figure 
> out how to get a hold of it.
>
> Is it possible to get the current instance of QgsProject in the 
> context of QGIS server?
>
> At first I tried to do it as I would on a plugin for the desktop:
>
> ```
> qgis_project = QgsProject.instance()
> layout_manager = qgis_project.layoutManager()
> my_layout = layout_manager.getLayoutByName("the_name")
> # this fails, my_layout is None
> ```
>
> This approach does not work, as the resulting qgis_project is not the 
> one I am using in my request.
>
> Then I searched through the properties of `QgsServerInterface`, hoping 
> to find some sort of `getCurrentProject()` method - but this does not 
> seem to exist.
>
> I also tried loading the project from disk in my plugin with
>
> ```
> current_project = QgsProject.instance()
> current_project.read(server_iface..configFilePath())
> ```
>
> This second approach does allow me to load up the project, but any 
> changes I set at runtime are not propagated to subsequent handlers in 
> the QGIS Server workflow, meaning that the `GetPrint` handler does not 
> see my changes to the project.
>
> I don't want to save the changes, just set them at runtime and use 
> them. This is because other (potentially parallel) requests will also 
> need to modify the aforementioned layout in order to customize their 
> printing needs.
>
> Is it at all possible to do what I am trying to do? Or is there maybe 
> a more proper way?
>
> Thanks in advance
>
> -- 
> ___________________________ ___ __
> Ricardo Garcia Silva
>
> _______________________________________________
> QGIS-Developer mailing list
> QGIS-Developer at lists.osgeo.org
> List info:https://lists.osgeo.org/mailman/listinfo/qgis-developer
> Unsubscribe:https://lists.osgeo.org/mailman/listinfo/qgis-developer
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.osgeo.org/pipermail/qgis-developer/attachments/20250331/2312232f/attachment.htm>


More information about the QGIS-Developer mailing list