With QGIS 2.12 the new Python bindings for QGIS server are now available and the server can be invoked directly from a python scripts with just a few lines of code:
from qgis.server import QgsServer my_query_string = "map=/projects/my_project.qgs&SERVICE=WMS&request=GetCapabilities" headers, body = QgsServer().handleRequest(my_query_string)
Embedding QGIS in a Python web application
Embedding QGIS Server in a web application is now not only possible but really very easy, for example, a Django view:
# QGIS server view from django.http import HttpResponse from django.views.generic import View from qgis.server import * class OGC(View): """Pass a GET request to QGIS Server and return the response""" def __init__(self): self.server = QgsServer() def get(self, request, *args, **kwargs): """Pass a GET request to QGIS Server and return the response""" headers, body = self.server.handleRequest(request.GET.urlencode()) response = HttpResponse(body) # Parse headers for header in headers.split('\n'): if header: k, v = header.split(': ', 1) response[k] = v return response
Using server plugins
Of course Python server plugins can be plugged in easily, see the example below:
# QGIS server view from django.http import HttpResponse from django.views.generic import View from qgis.server import * from qgis.core import * class OGC(View): """Pass a GET request to QGIS Server and return the response""" def __init__(self): self.server = QgsServer() # Call init to create serverInterface self.server.init() serverIface = self.server.serverInterface() class Filter1(QgsServerFilter): def responseComplete(self): QgsMessageLog.logMessage("Filter1.responseComplete", "Server", QgsMessageLog.INFO ) request = self.serverInterface().requestHandler() if request.parameter('REQUEST') == 'HELLO': request.clearHeaders() request.setHeader('Content-type', 'text/plain') request.clearBody() request.appendBody('Hello from SimpleServer!') def requestReady(self): QgsMessageLog.logMessage("Filter1.requestReady") self.filter = Filter1(serverIface) serverIface.registerFilter(self.filter) def get(self, request, *args, **kwargs): """Pass a GET request to QGIS Server and return the response""" headers, body = self.server.handleRequest(request.GET.urlencode()) response = HttpResponse(body) # Parse headers for header in headers.split('\n'): if header: k, v = header.split(': ', 1) response[k] = v return response
Enjoy QGIS Server with Python!