Ejecución de aplicaciones WSGI con IPM
Introducción a la ejecución de WSGI en IRIS
Con IRIS 2024+, los usuarios podéis alojar aplicaciones WSGI utilizando Security.Applications. Como ejemplo, un usuario puede hacer algo como esto
Ejemplo de trabajo mínimo
zn "%SYS"
Kill props
Set props("Description") = "Sample WSGI Application"
Set props("MatchRoles") = ":%All"
Set props("WSGIAppLocation") = "/path/to/flaskapp"
Set props("WSGIAppName") = "myapp"
Set props("WSGICallable") = "app"
Set props("DispatchClass") = "%SYS.Python.WSGI" // important, otherwise will be recognized as CSP application
Set sc = ##class(Security.Applications).Create("/flask", .props)
zw sc
donde el directorio /path/to/flaskapp contiene un archivo myapp.py que dice
from flask import Flask
app = Flask(__name__)
@app.route("/")
def index():
return "Hello, WSGI!"
Ahora, id a la URL http(s)://<host>:<port>/<optional-prefix>/flask/. Debería mostrar "¡Hello, WSGI!" en texto sin formato.
Errores comunes
Si la URL http(s)://
/flask/ no funciona, comprobad primero la barra diagonal final, que debe estar presente. Además, cuando se ejecuta por primera vez,
flasknecesita ser instalado para python embebido (no su intérprete python local a nivel de SO). Comprobad que la instalación se ha realizado correctamente accediendo al intérprete de python embebido y ejecutandoimport flask.Finalmente, se debe conceder permiso de lectura, para
/path/to/flaskapp/myapp.pyy todas las carpetas superiores, al usuario del SO con que se esté ejecutando IRIS .Si el error sigue sin resolverse, comprobad si hay entradas en
messages.log. También podéis poneros en contacto con nosotros a través de posting an issue
Uso de IPM para enviar aplicaciones WSGI de fácil instalación
IPM facilita el proceso:
- copiando el directorio de la aplicación flask a un lugar con acceso de lectura garantizado
- instalando las dependencias python relevantes en un archivo
requirements.txt.
Ejemplo de paquete
Aquí hay un ejemplo que puede instalarse fácilmente donde quiera que IPM (v0.6.3+) esté instalado en IRIS 2024+. Clonad este paquete a un <PACKAGE_ROOT> adecuado, e iniciad un terminal IRIS
zn "%SYS"
zpm "load <PACKAGE_ROOT>"
Tras la instalación, deberíais poder visitar http(s)://<host>:<port>/<optional-instance-prefix>/my/flask/demo/. En mi caso, la URL es http://localhost:8080/iris-ml-wsgi/my/flask/demo/ y se lee:
This is a sample WSGI application using Flask!
Sugerencia: necesitáis instalar zpm siguiendo las instrucciones aquí primero para que el comando zpm funcione.
El module.xml del repositorio anterior también está listado aquí para una referencia rápida
<?xml version="1.0" encoding="UTF-8"?>
<Export generator="Cache" version="25">
<Document name="flask-demo.ZPM">
<Module>
<Name>flask-demo</Name>
<Version>1.0.0</Version>
<Description>This is a demo of a flask application</Description>
<Keywords>flask</Keywords>
<Author>
<Person>Shuheng Liu</Person>
<Organization>InterSystems</Organization>
<CopyrightDate>2024</CopyrightDate>
<License>MIT</License>
<Notes>notes</Notes>
</Author>
<Packaging>module</Packaging>
<SystemRequirements Version=">=2024.1" />
<SourcesRoot>src</SourcesRoot>
<FileCopy Name="src/python/flaskapp/" Target="${libdir}flask-demo/flaskapp/"/>
<SystemSetting Name="CSP.DefaultFileCharset" Value="UTF-8"/>
<WSGIApplication
Url="/my/flask/demo"
UnauthenticatedEnabled="1"
Description="Sample WSGI application using Flask"
MatchRoles=":${dbrole}"
WSGIAppLocation="${libdir}flask-demo/flaskapp/"
WSGIAppName="app"
WSGICallable="app"
/>
<AfterInstallMessage>Module installed successfully!</AfterInstallMessage>
</Module>
</Document>
</Export>