Rodando aplicações WSGI com IPM
Introdução ao WSGI em IRIS
Com o IRIS 2024+, os usuários podem hospedar aplicações WSGI usando Security.Applications. Por exemplo, um usuário pode fazer algo como o seguinte:
Exemplo funcional 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" // importante, se não será reconhecido como uma aplicação CSP
Set sc = ##class(Security.Applications).Create("/flask", .props)
zw sc
onde o diretório /path/to/flaskapp contém um arquivo myapp.py que lê
from flask import Flask
app = Flask(__name__)
@app.route("/")
def index():
return "Olá, WSGI!"
Agora, vá para a URL http(s)://<host>:<port>/<optional-prefix>/flask/. Ela deve mostrar "Olá, WSGI!" em texto padrão.
Armadilhas comuns
Se a URL http(s)://
/flask/ não estiver funcionando, verifique a barra no final, que deve estar presente. Além disso, ao rodar pela primeira vez,
flaskdeve estar instalado installed para o python embutido (não seu interpretador local a nível de SO - sistema operacional). Verifique se a instalação teve sucesso entrando no terminal de comando de python embutido e rodandoimport flask.Finalmente, a permissão de leitura de qualquer usuário de SO que o IRIS assuma deve ser garantida ao caminho
/path/to/flaskapp/myapp.pye todas as pastas pai.Se o erro ainda não for resolvido, verifique as entradas em
messages.log. Você também pode entrar em contato conosco postando um issue
Usando IPM para enviar aplicações WSGI para fácil instalação
O IPM faz esse processo mais fácil ao
- copiar o diretório flask app para um caminho com acesso de leitura garantido
- instalar dependências python relecantes em um arquivo
requirements.txt
Exemplo de pacote
Aqui está um exemplo que pode ser instalado facilmente em qualquer IPM (v0.6.3+) instalado em IRIS 2024+. Clone esse pacote para um <PACKAGE_ROOT> adequado e inicie um terminal IRIS.
zn "%SYS"
zpm "load <PACKAGE_ROOT>"
Após instalação bem sucedida, você deve poder visitar http(s)://<host>:<port>/<optional-instance-prefix>/my/flask/demo/. No meu caso, a URL é http://localhost:8080/iris-ml-wsgi/my/flask/demo/ e lê-se:
This is a sample WSGI application using Flask!
Dica: Você precisa instalar zpm seguindo as instruções aqui primeiro, para que o comando zpm funcione.
O module.xml do repositório acima também está listado aqui para rápida referência
<?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>