Artigo
· Jul. 18 3min de leitura

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

  1. Se a URL http(s):///flask/ não estiver funcionando, verifique a barra no final, que deve estar presente.

  2. Além disso, ao rodar pela primeira vez, flask deve 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 rodando import flask.

  3. 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.py e todas as pastas pai.

  4. 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
1. copiar o diretório flask app para um caminho com acesso de leitura garantido
2. 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>
Discussão (0)1
Entre ou crie uma conta para continuar