
With QGIS 2.12 released, the new Python bindings for QGIS server are finally available!
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!