Sări la conținutul principal

Server Proxy GeoServer (Python)

Bibliotecile web-based pentru hărți (Leaflet, OpenLayers, Mapbox GL) nu pot seta anteturi HTTP personalizate pe cererile de plăci WMS sau de obiecte WFS - aceasta este o restricție de securitate a browserului. Aceasta înseamnă că nu poți transmite direct antetul Authorization din JavaScript pe partea de client.

Soluția este un proxy de backend: un mic server care se află între frontend-ul tău și Qarta. Browserul tău trimite cereri neautentificate către proxy; proxy-ul adaugă cheia API pe partea de server și redirecționează cererea la Qarta.

Browser  →  /wms/GetMap?...  →  Proxy (adaugă Authorization header)  →  Qarta

Proxy-ul din acest ghid este o aplicație Python/Flask minimă. Doar atașează cheia API - nu modifică, nu inspectează și nu stochează în cache cererile.

Descărcare

Descarcă geoserver-proxy.zip

Fișierul zip conține proxy.py, pyproject.toml și o suită completă de teste.

Rularea Proxy-ului

Instalare dependențe:

unzip geoserver-proxy.zip
cd geoserver-proxy
pip install -e ".[dev]"

Pornire server:

export QARTA_API_KEY=your_api_key_here
python proxy.py
# Listening on http://0.0.0.0:8080

Variabile de mediu opționale:

VariabilăImplicitDescriere
QARTA_API_KEY(obligatoriu)Cheia API Qarta
QARTA_BASE_URLhttps://graph.quarticle.roURL-ul de bază Qarta aval
PROXY_TIMEOUT30Timeout cere aval în secunde

Conectarea hărții web

Direcționează stratul WMS Leaflet către proxy în loc de a-l direcționa direct la Qarta:

import L from 'leaflet';

const map = L.map('map').setView([40.7128, -74.0060], 10);

L.tileLayer('https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png', {
attribution: '© OpenStreetMap contributors'
}).addTo(map);

// Direcționează către proxy - fără cheie API în cod pe partea de client
const wmsLayer = L.tileLayer.wms('http://localhost:8080/wms/GetMap', {
layers: 'GRAPHRASTER:light_pollution',
styles: '',
format: 'image/png',
transparent: true,
srs: 'EPSG:3857',
version: '1.3.0',
}).addTo(map);

Alte operații WMS (GetCapabilities, GetFeatureInfo, GetLegendGraphic, DescribeLayer) și operații WFS (GetFeature) sunt redirecționate în același mod - doar schimbă calea:

http://localhost:8080/wms/GetCapabilities
http://localhost:8080/wms/GetFeatureInfo
http://localhost:8080/wms/GetLegendGraphic
http://localhost:8080/wfs/GetFeature

Codul sursă al proxy-ului

examples/geoserver-proxy/proxy.py
import os

import requests
from flask import Flask, Response, request

QARTA_BASE_URL = os.getenv("QARTA_BASE_URL", "https://graph.quarticle.ro")
QARTA_API_KEY = os.getenv("QARTA_API_KEY")
PROXY_TIMEOUT = int(os.getenv("PROXY_TIMEOUT", "30"))

app = Flask(__name__)


def _forward(service: str, operation: str) -> Response:
"""Forward a WMS or WFS request to Qarta, injecting the API key."""
upstream_url = f"{QARTA_BASE_URL}/graph/layers/{service}/{operation}"
resp = requests.get(
upstream_url,
params=request.args,
headers={"Authorization": QARTA_API_KEY},
timeout=PROXY_TIMEOUT,
stream=True,
)
return Response(
resp.iter_content(chunk_size=8192),
status=resp.status_code,
content_type=resp.headers.get("Content-Type", "application/octet-stream"),
)


@app.get("/wms/<operation>")
def wms_proxy(operation: str) -> Response:
return _forward("wms", operation)


@app.get("/wfs/<operation>")
def wfs_proxy(operation: str) -> Response:
return _forward("wfs", operation)


if __name__ == "__main__":
if not QARTA_API_KEY:
raise RuntimeError("QARTA_API_KEY environment variable is required")
app.run(host="0.0.0.0", port=8080)

Rularea testelor

cd geoserver-proxy
pytest tests/ -v

Testele folosesc responses pentru a simula toate apelurile Qarta aval - nu se fac cereri de rețea reale.

Pași următori